水平仪 APK
  HvTJUzsxOBtS 2023年11月25日 30 0



文章目录

  • 1、实现功能
  • 2、XML文件
  • 3、功能代码


1、实现功能

随着手机的转动,可以看到图片,在不同位置显示

原始布局显示:

水平仪 APK_android

当手机竖起来的时候:

水平仪 APK_android_02

2、XML文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout"
    tools:context="com.example.albert.myapplication.MainActivity">


    <ImageView
        android:id="@+id/movimg_id"
        android:layout_width="50dp"
        android:layout_height="80dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:src="@mipmap/ic_launcher"/>


        <ImageView
            android:id="@+id/img_id"
            android:layout_width="50dp"
            android:layout_height="80dp"
            android:layout_centerInParent="true"
            android:alpha="0.5"
            android:src="@mipmap/ic_launcher"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:id="@+id/view_id"
        android:text="sensor"
        android:gravity="center"
        android:textSize="30dp"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>
3、功能代码
package com.example.albert.myapplication;

import android.content.pm.ActivityInfo;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements  SensorEventListener{
     SensorManager sm; //传感器管理器
     Sensor sr; //加速传感器对象
     TextView txv; //界面中的文本组件

    ImageView igv; //界面要移动的小图
    RelativeLayout layout; //界面layout 组件
    double mx = 0, my = 0; //存储xy方向 每一等分的大小(默认0)



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //设置手机不随屏幕旋转
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

        //从系统服务获取传感器管理器
        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        sr = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//获取加速传感器
        txv = (TextView) findViewById(R.id.view_id);//获取textView组件

        igv = (ImageView) findViewById(R.id.movimg_id);//要移动的组件

        layout = (RelativeLayout) findViewById(R.id.layout);//获取layout组件

    }

    public void onSensorChanged(SensorEvent event) { //当加速的值改变的时候执行此函数

        if (mx == 0) { //如果还没有计算过
            //设计移动图片在X方向上总共有20个移动单位,每个单位的大小
            mx = (layout.getWidth() - igv.getWidth()) /20.0;
            //计算Y方向上移动每一份的大小
            my = (layout.getHeight() - igv.getHeight()) /20.0;
        }

        //获取移动小图的layoutparams 对象
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) igv.getLayoutParams();
        //设置倾斜之后的左边界位置
        params.leftMargin = (int) ((10-event.values[0])*mx);
        //设置倾斜之后上边界位置
        params.topMargin = (int) ((10-event.values[1])*my);
        //将小图标应用LayoutParams 按照参数设置
        igv.setLayoutParams(params);

        //显示传感器数值
      txv.setText(String.format("X轴: %1.2f,Y轴:%1.2f,Z轴:%1.2f",event.values[0],
              event.values[1], event.values[2]));
    }


    public void onAccuracyChanged(Sensor arg0, int arg1) {
        //精度改变时不需要处理
    }


    protected void onResume(){ //当Activity 界面显示出来的时候
        super.onResume();
        //向加速传感器(sr)注册监听对象this
        sm.registerListener(this,sr,SensorManager.SENSOR_DELAY_NORMAL);
    }

    protected void onPause() {  //当activity 界面被取消焦点的时候
        super.onPause();
        //取消监听对象thisd的注册
        sm.unregisterListener(this);
    }
}

文献参考:
android app开发入门 施威铭 编著

本人郑重声明,本博客所著文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若以上文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月25日 0

暂无评论

推荐阅读
HvTJUzsxOBtS