2013-03-06 78 views
4

我正在使用简单的指南针应用程序。我需要为传感器活动设置指南针视图,以便选择指南针视图类。但它只是为罗盘视图绘制一个圆圈和一条线。我需要自定义这个视图,通过替换这个圆圈和行与我自己的可绘制图像有人请帮我解决这个问题。如何在android中制作自定义指南针视图

我的视图类

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.View; 

public class MyCompassView extends View { 

    private Paint paint; 
    private float position = 0; 

    public MyCompassView(Context context) { 
    super(context); 
    init(); 
    } 

    private void init() { 
    paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setStrokeWidth(2); 
    paint.setTextSize(25); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setColor(Color.WHITE); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
    int xPoint = getMeasuredWidth()/2; 
    int yPoint = getMeasuredHeight()/2; 

    float radius = (float) (Math.max(xPoint, yPoint) * 0.6); 
    canvas.drawCircle(xPoint, yPoint, radius, paint); 
    canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint); 

    // 3.143 is a good approximation for the circle 
    canvas.drawLine(xPoint, 
     yPoint, 
     (float) (xPoint + radius 
      * Math.sin((double) (-position)/180 * 3.143)), 
     (float) (yPoint - radius 
      * Math.cos((double) (-position)/180 * 3.143)), paint); 

    canvas.drawText(String.valueOf(position), xPoint, yPoint, paint); 
    } 

    public void updateData(float position) { 
    this.position = position; 
    invalidate(); 
    } 

} 

回答

1

上述代码已被弃用。更新的代码可以here

XML布局activty_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#fff" > 
    <TextView 
     android:id="@+id/tvHeading" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="40dp" 
     android:layout_marginTop="20dp" 
     android:text="Heading: 0.0" /> 
    <ImageView 
     android:id="@+id/imageViewCompass" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/tvHeading" 
     android:layout_centerHorizontal="true" 
     android:src="@drawable/img_compass" /> 
</RelativeLayout> 

MainActivity

public class MainActivity extends Activity implements SensorEventListener { 

    // define the display assembly compass picture 
    private ImageView image; 

    // record the compass picture angle turned 
    private float currentDegree = 0f; 

    // device sensor manager 
    private SensorManager mSensorManager; 

    TextView tvHeading; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // 
     image = (ImageView) findViewById(R.id.main_iv); 

     // TextView that will tell the user what degree is he heading 
     tvHeading = (TextView) findViewById(R.id.tvHeading); 

     // initialize your android device sensor capabilities 
     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // for the system's orientation sensor registered listeners 
     mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
       SensorManager.SENSOR_DELAY_GAME); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     // to stop the listener and save battery 
     mSensorManager.unregisterListener(this); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 

     // get the angle around the z-axis rotated 
     float degree = Math.round(event.values[0]); 

     tvHeading.setText("Heading: " + Float.toString(degree) + " degrees"); 

     // create a rotation animation (reverse turn degree degrees) 
     RotateAnimation ra = new RotateAnimation(
       currentDegree, 
       -degree, 
       Animation.RELATIVE_TO_SELF, 0.5f, 
       Animation.RELATIVE_TO_SELF, 
       0.5f); 

     // how long the animation will take place 
     ra.setDuration(210); 

     // set the animation after the end of the reservation status 
     ra.setFillAfter(true); 

     // Start the animation 
     image.startAnimation(ra); 
     currentDegree = -degree; 

    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // not in use 
    } 
} 
+1

答案是多一点的链接不被认为是很好的答案,并作为评价更好。如果你想添加更多的细节,特别是代码和如何实现解决方案,那么这将是一个更好的答案。 – psubsee2003 2013-11-30 16:23:15

+0

我在创建的应用程序中使用此指南针代码,需要一些编辑帮助以使其适用于我的应用程序。你能检查我的问题并尝试帮忙吗? http://stackoverflow.com/questions/22724671/how-to-point-a-compass-to-a-given-bearing-angle – Bob21 2014-03-31 04:42:56