【问题标题】:How to make a customized compass view in android如何在android中制作自定义指南针视图
【发布时间】:2013-03-06 06:53:40
【问题描述】:

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

我的视图类

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();
  }

} 

【问题讨论】:

    标签: android android-view digital-compass


    【解决方案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
        }
    }
    

    【讨论】:

    • 只是一个链接的答案不被认为是好的答案,并且作为 cmets 更好。如果您想添加更多细节,特别是代码以及如何实现解决方案,那将是一个更好的答案。
    • 我正在创建的应用程序中使用此指南针代码,需要一些帮助编辑以使其适用于我的应用程序。你能检查我的问题并尝试提供帮助吗? stackoverflow.com/questions/22724671/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多