How to make a customized compass view in android

匿名 (未验证) 提交于 2019-12-03 07:36:14

问题:

I am working with a simple compass application. I need to set the compass view with the sensor activity for that i choose a compass view class. But it is only drawing a circle and a line for the compass view. I need to customize this view by replacing this circle and line with my own drawable images somebody please help me to fix this.

My view class

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:

The above code has been deprecated . an updated code is available here

XML Layout 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     } } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!