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

来源:互联网 发布:电气工程师设计软件 编辑:程序博客网 时间:2024/04/30 04:56

先上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下载地址

原创粉丝点击