先上ofo效果图
模仿图
自己为小黄人增加了墨镜
实现原理很简单,就是根据传感器控制控件的移动。
上代码:
实例化传感器管理器对象,并实现传感器监听:
public class MainActivity extends AppCompatActivity implements SensorEventListener {
SensorManager sensorManager;//传感器管理器对象
Sensor orientation,light;//方向传感器,光照传感器
ImageView iv_eyes;//眼睛
LinearLayout ll_glasses;//眼镜
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(this.SENSOR_SERVICE);
orientation = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
light=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
iv_eyes= (ImageView) findViewById(R.id.iv_eyes);
ll_glasses= (LinearLayout) findViewById(R.id.ll_glasses);
在传感器监听实现我们的业务:
//传感器监听
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
//给光照传感器设置达到700换墨镜
if(sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){
// values值为225.0 0.0 0.0,第一个就是光照强度
float[] values = sensorEvent.values;
if(values[0]>700){
ll_glasses.setVisibility(View.VISIBLE);
}else{
ll_glasses.setVisibility(View.INVISIBLE);
}
}
//给方向传感器设置转动眼睛
if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
float[] values = sensorEvent.values;
// values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。可以利用这个特性来实现电子罗盘
// values[1]:当手机绕着X轴倾斜时该值发生变化。手机顶部抬起值会变小,底部反之。values[1]的取值范围是-180≤values[1]≤180。
// values[2]:表示手机沿着Y轴的滚动角度。手机右侧抬起值变大,左侧反之。取值范围是-90≤values[2]≤90。
// 超过阈值就不做处理,以防眼睛越出范围
if(values[1]>40||values[1]<-20||values[2]>35||values[2]<-30){
return;
}
change(values[2]-x,values[1]-y);
x=values[2];
y=values[1];
}
眼睛转动动画:
//转动眼睛属性动画
private void change(float x,float y){
//X方向移动
ObjectAnimator x_anim = ObjectAnimator.ofFloat(iv_eyes, "x",
iv_eyes.getX(), iv_eyes.getX()-x);
//Y方向移动
ObjectAnimator y_anim = ObjectAnimator.ofFloat(iv_eyes, "y",
iv_eyes.getY(), iv_eyes.getY()-y);
x_anim.setDuration(100);
y_anim.setDuration(100);
x_anim.start();
y_anim.start();
}
在生命周期里对传感器进行注册和注销:
//转动眼睛属性动画
private void change(float x,float y){
//X方向移动
ObjectAnimator x_anim = ObjectAnimator.ofFloat(iv_eyes, "x",
iv_eyes.getX(), iv_eyes.getX()-x);
//Y方向移动
ObjectAnimator y_anim = ObjectAnimator.ofFloat(iv_eyes, "y",
iv_eyes.getY(), iv_eyes.getY()-y);
x_anim.setDuration(100);
y_anim.setDuration(100);
x_anim.start();
y_anim.start();
}
项目下载:
解压导入module,修改compileSdkVersion和buildToolVersion和你的AS一致就ok了