模仿ofo小黄人眼睛跟随手机移动

先上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了

demo下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值