文章目录
- 1、实现功能
- 2、XML文件
- 3、功能代码
1、实现功能
随着手机的转动,可以看到图片,在不同位置显示
原始布局显示:
当手机竖起来的时候:
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开发入门 施威铭 编著
本人郑重声明,本博客所著文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若以上文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。