美文网首页
Android 指南针

Android 指南针

作者: 残非 | 来源:发表于2019-10-12 10:57 被阅读0次

MainActivity

public class MainActivity extends AppCompatActivity implements SensorEventListener{

    private TextView tv1,tv2,tv3;
    private ImageView img;
    private SensorManager sensorManager;
    private Sensor sensor;
    private float startAngle = 0;
    private DefinedRotateAnimation definedRotateAnimation;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        //https://gitee.com/zhanma/codes/qw28ndj0akcpvf65hl1rg41#%E5%B8%83%E5%B1%80%E6%96%87%E4%BB%B6
        tv1 = (TextView)findViewById(R.id.tv1);
        tv2 = (TextView)findViewById(R.id.tv2);
        tv3 = (TextView)findViewById(R.id.tv3);
        img = (ImageView)findViewById(R.id.img);

        //获取传感器管理者,通过系统获取
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        //获取方向传感器
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

        definedRotateAnimation = new DefinedRotateAnimation();
            definedRotateAnimation.setDuration(200);
        definedRotateAnimation.setFillAfter(true);

        tv1.bringToFront();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //第三个参数:传感器刷新的更新速度
        sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_GAME);
    }
    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        float presentAngle = event.values[0];
        if(startAngle == (-presentAngle)){
            return ;
        }
        if((presentAngle>=340&&presentAngle<=360)||(presentAngle>=0&&presentAngle<=20)){
            tv3.setText("北");
        }else if(presentAngle>20&&presentAngle<70){
            tv3.setText("东北");
        }else if(presentAngle>=70&&presentAngle<=110){
            tv3.setText("东");
        }else if(presentAngle>110&&presentAngle<160){
            tv3.setText("东南");
            }else if(presentAngle>=160&&presentAngle<=200){
            tv3.setText("南");
        }else if(presentAngle>200&presentAngle<250){
            tv3.setText("西南");
        }else if(presentAngle>=250&&presentAngle<=290){
            tv3.setText("西");
        }else {
            tv3.setText("西北");
        }
        tv2.setText((int)presentAngle + "°");
        presentAngle = (-presentAngle);
        definedRotateAnimation.setStartAngle(startAngle);
        definedRotateAnimation.setEndAngle(presentAngle);
        img.startAnimation(definedRotateAnimation);
        startAngle = presentAngle;
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

DefinedRotateAnimation(自定义旋转动画)

class DefinedRotateAnimation extends Animation{
    private float startAngle = 0;
    private float endAngle = 0;
    private int width = 0;
    private int height = 0;
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        this.width = width;
        this.height = height;
    }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
            float angleDifference = endAngle - startAngle;
        //interpolatedTime时间区间【0-1】,逐渐递增
        t.getMatrix().setRotate(startAngle + angleDifference * interpolatedTime,width/2,height/2);
    }

    public float getStartAngle(){
        return this.startAngle;
    }
    public void setStartAngle(float startAngle){
        this.startAngle = startAngle;
    }
    public float getEndAngle(){
        return this.endAngle;
    }
    public void setEndAngle(float endAngle){
        this.endAngle = endAngle;
    }
}

XML文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.lenovo.zm0903_zhinanzheng.MainActivity">

<TextView
    android:id="@+id/tv1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="|"
    android:textSize="40dp"
    android:textColor="@color/colorPrimary"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="52dp"
    ></TextView>

<ImageView
    android:id="@+id/img"
    android:layout_width="340dp"
    android:layout_height="340dp"
    android:background="@drawable/a"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="50dp"
    ></ImageView>

<TextView
    android:id="@+id/tv2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="50sp"
    android:textColor="@color/colorPrimaryDark"
    android:layout_below="@id/img"
    android:layout_marginTop="10dp"
    android:layout_centerHorizontal="true"
    android:text="239"
    ></TextView>
<TextView
    android:id="@+id/tv3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="25sp"
    android:textColor="@color/colorPrimary"
    android:layout_marginTop="3dp"
    android:layout_below="@id/tv2"
    android:layout_centerHorizontal="true"
    android:text="西南 "
    ></TextView>

</RelativeLayout >

图片资源

a.jpg

相关文章

  • Android 指南针

    MainActivity DefinedRotateAnimation(自定义旋转动画) XML文件 图片资源

  • Android 指南针

    指南针 关于指南针的实现,网上已经有很多的文章了,原理都一样,要使用Android系统的传感器实现,我们先简单看一...

  • Android指南针实现

    功能实现:通过指南针传感器获得转动角度,设置指南针图片的转动动画即可 获取系统 SensorManager 来进行...

  • Android:指南针的制作

    指南针主要是通过方向传感器来获取方位的,使用传感器呢,我们主要用到SensorManager类和Sensor类,通...

  • 指南针小组1月活动汇总贴

    1.组内讨论 1.1指南针小组启动会 小生:2016揩油-指南针-启动会 1.2指南针小组第二次讨论 指南针小组 ...

  • Android开发(27) 做个指南针应用

    概述 现在一般android手机里都有 磁场传感器,它能检测到方向。我们做个指南针应用玩玩。 思路 1.获得传感器...

  • 认识指南针与新西兰

    一、指南针 1.指南针与磁场 指南针红色是北方。现在制作的指南针统一是按照国际标准,磁针红色端为磁针的N极,也就是...

  • Android-方向传感器(制作指南针)

    方向传感器(制作指南针) Android中的方向传感器可以准确的判断出手机在各个方向的旋转角度,利用这些角度就可以...

  • 教资中学科一:六、科学素养

    四大发明 1、指南针 (1)战国发明“司南” (2)北宋,指南针用于航海 (3)指南针促进航海,迎来了地理大发现 ...

  • D12 指南针&地图

    1、引导你走出困境的指南针可能在哪里了? 2、除了指南针,还有什么可以帮助你找到前行的方向? 3、指南针对你来说意...

网友评论

      本文标题:Android 指南针

      本文链接:https://www.haomeiwen.com/subject/ujfqmctx.html