安卓 摇一摇 包含 objectAnimator valueAnimator的动画效果
public class MyAnimationDemo extends BaseActivity implements SensorEventListener{ private View mCircleLight; private ObjectAnimator mCircleLightAnimator; private CurtainView mCurtainView; private ImageView mIvStar; private ObjectAnimator mIvStarAnimator; private long lastShakeTime; private int mAnimationCurrentState; private Sensor mAccecerateSonsor; private SensorManager mSensorManager; @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }//精度发生变化时触发 @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType()==TYPE_ACCELEROMETER) { float value[] = event.values; float x = value[0]; float y = value[1]; float z = value[2]; if (System.currentTimeMillis() - lastShakeTime > 2000 &&Math.abs(x)>17&&Math.abs(y)>17&&Math.abs(z)>17){ lastShakeTime = System.currentTimeMillis(); startAnimation(); } } }//传感器value值发生变化时触发 @Override public void onNetworkChanged() { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acrivity_animation_demo); initview(); initAnimator(); } private void initview(){ mCircleLight = (View)findViewById(R.id.animation_light); mCurtainView = (CurtainView)findViewById(R.id.animation_curtain); mIvStar = (ImageView)findViewById(R.id.animation_star); } private void initAnimator(){ mCircleLightAnimator = new ObjectAnimator(); mCircleLightAnimator.setTarget(mCircleLight); mCircleLightAnimator.setPropertyName("rotation"); mCircleLightAnimator.setFloatValues(0,360); mCircleLightAnimator.setDuration(1000); mCircleLightAnimator.setRepeatMode(ValueAnimator.RESTART); mCircleLightAnimator.setInterpolator(new LinearInterpolator()); mCircleLightAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { mCurtainView.closeWindow(); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); mIvStarAnimator = new ObjectAnimator(); // mIvStarAnimator.ofFloat(mIvStar,"rotationY",0,180); mIvStarAnimator.setTarget(mIvStar); mIvStarAnimator.setPropertyName("rotateX"); mIvStarAnimator.setFloatValues(0,360); mIvStarAnimator.setInterpolator(new LinearInterpolator()); mIvStarAnimator.setDuration(2000); mIvStarAnimator.setRepeatMode(ValueAnimator.RESTART); } private void startAnimation(){ mCurtainView.setVisibility(View.VISIBLE); mCurtainView.openWindow(); mCircleLightAnimator.start(); } @Override protected void onResume() { super.onResume(); mSensorManager =(SensorManager) getApplicationContext().getSystemService(SENSOR_SERVICE); if (mSensorManager != null) { mAccecerateSonsor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (mAccecerateSonsor!=null){ mSensorManager.registerListener(this,mAccecerateSonsor,SensorManager.SENSOR_DELAY_UI); } } } @Override protected void onDestroy() { super.onDestroy(); if (mSensorManager != null) { mAccecerateSonsor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (mAccecerateSonsor!=null){ mSensorManager.unregisterListener(this,mAccecerateSonsor); } } } }
onpause的时候也记得注销 传感器呀
自定义view 利用ValueAnimator实现窗帘开闭合动画
public class CurtainView extends View implements ValueAnimator.AnimatorUpdateListener,Animation.AnimationListener { int mCurtainstate = 0;//0 完全打开 1 打开 2 闭合动作 3 完全闭合 private Paint mPaint; private RectF mRectF; private ValueAnimator mAnimator; public CurtainView(Context context) { this(context,null); } public CurtainView(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public CurtainView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); mPaint.setColor(Color.WHITE); mAnimator = new ValueAnimator(); mAnimator.setDuration(500); mAnimator.addUpdateListener(this); mAnimator.setInterpolator(new DecelerateInterpolator()); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(Math.min(widthMeasureSpec,heightMeasureSpec),Math.min(widthMeasureSpec,heightMeasureSpec)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mRectF==null){ mRectF = new RectF(0,0,getMeasuredWidth(),getMeasuredHeight()); } if (mAnimator.getAnimatedValue()!=null){ int i = (int)mAnimator.getAnimatedValue(); canvas.drawArc(mRectF,90-i,i*2,false,mPaint);//s上半边窗帘 canvas.drawArc(mRectF,270-i,i*2,false,mPaint); } } public void openWindow(){ mCurtainstate = 1; mAnimator.setIntValues(0,90); mAnimator.start(); } public void closeWindow(){ mCurtainstate=2; mAnimator.setIntValues((int)mAnimator.getAnimatedValue(),0); mAnimator.start(); } @Override public void onAnimationUpdate(ValueAnimator animation) { invalidate(); } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { if (mCurtainstate ==1){ mCurtainstate = 0; }else if (mCurtainstate==2){ mCurtainstate=3; } } }