高仿微信摇一摇,动画效果为左右晃动

学习到东西,发出来帮助更多的人,做一个有奉献精神的人!
原文地址;http://blog.csdn.net/catoop/article/details/8051835,原博主实现了摇一摇

在这几天的学习中,添加了状态栏和摇晃完以后的动画




思路;
1.getSystemService(SENSOR_SERVICE)得到SensorManager ,有了它你就可以管理传感器了
2.getSystemService(VEBRATOR_SERVICE)得到手机振动的服务
3.initActionBar 设置手机状态栏的返回键
4.重力感应监听
5handler发送消息
6监听到以后 执行动画

代码如下
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.dong.shake.MainActivity">
    <ImageView
        android:id="@+id/iv_shake"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@mipmap/shake_logo"/>
</RelativeLayout>

activity中的代码


public class MainActivity extends AppCompatActivity {
    @Bind(R.id.iv_shake)
    ImageView ivShake;
    private static final String TAG = "TestSensorActivity";
    private static final int SENSOR_SHAKE = 10;
    private SensorManager sensorManager;
    private Vibrator vibrator;
    private boolean isShaking = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
        initActionBar();//可以设置状态栏的按钮和内容(返回键)
    }
    private void initActionBar() {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setTitle("摇一摇");
    }
    @Override
    protected void onResume() {
        super.onResume();
        if (sensorManager != null) {
            // 第一个参数是Listener,第二个参数是所得传感器类型,第三个参数值获取传感器信息的频率
            sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
        }
    }
    @Override
    protected void onPause() {
        super.onPause();
        if (sensorManager != null) {
            // 取消监听器
            sensorManager.unregisterListener(sensorEventListener);
        }
    }
    /**
     * 重力感应监听
     */
    private SensorEventListener sensorEventListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            // 传感器信息改变时执行该方法
            float[] values = event.values;
            float x = values[0]; // x轴方向的重力加速度,向右为正
            float y = values[1]; // y轴方向的重力加速度,向前为正
            float z = values[2]; // z轴方向的重力加速度,向上为正
            Log.i(TAG, "x轴方向的重力加速度" + x + ";y轴方向的重力加速度" + y + ";z轴方向的重力加速度" + z);
            // 一般在这三个方向的重力加速度达到40就达到了摇晃手机的状态。
            int medumValue = 19;// 三星 i9250怎么晃都不会超过20,没办法,只设置19了
            if (Math.abs(x) > medumValue || Math.abs(y) > medumValue || Math.abs(z) > medumValue) {
                vibrator.vibrate(200);
                Message msg = new Message();
                msg.what = SENSOR_SHAKE;
                handler.sendMessage(msg);
            }
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };
    /**
     * 动作执行
     */
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case SENSOR_SHAKE:
                    if (!isShaking) {
                        startAnim();
                        isShaking = true;
                    }
                    break;
            }
        }
    };
    //定义摇一摇动画动画
    private void startAnim() {
        AnimationSet animup = new AnimationSet(true);
        TranslateAnimation animation0 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,
                Animation.RELATIVE_TO_SELF, -0.5f,Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,0.f);
        animation0.setDuration(300);
        TranslateAnimation animation1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,-0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,0.f);
        animation1.setDuration(300);
        animation1.setStartOffset(300);
        TranslateAnimation animation2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0.5f,
                Animation.RELATIVE_TO_SELF, 0f,Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,0.f);
        animation2.setDuration(300);
        animation2.setStartOffset(600);
        animup.addAnimation(animation0);
        animup.addAnimation(animation1);
        animup.addAnimation(animation2);
        animup.setRepeatCount(Animation.RESTART);
        ivShake.startAnimation(animup);
        ivShake.getAnimation().setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
                isShaking = false;
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //回退
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}


源码地址:https://github.com/moyanqi/Shake.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值