属性动画的使用实例
来源:互联网 发布:淘宝有没有隐形降权 编辑:程序博客网 时间:2024/05/11 14:00
写Android动画之前,先看两个之前写的例子。
1.状态栏的平滑消失与重现
代码:
public class MainActivity extends Activity { private View mView, mButton; private int mHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initView(); } private void initView() { mView = findViewById(R.id.ll); mButton = findViewById(R.id.start_button); float density = getResources().getDisplayMetrics().density; mHeight = (int) (40 * density + 0.5f); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mView.getVisibility() == View.GONE){ //do sth mView.setVisibility(View.VISIBLE); openAnim(mView, 0, mHeight); } else { // closeAnim(mView, mHeight, 0); } } }); } private void openAnim(View view, int start, int end) { ValueAnimator animator = createAnim(view, start, end); animator.start(); } private void closeAnim(final View view, int start, int end) { ValueAnimator animator = createAnim(view, start, end); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { view.setVisibility(View.GONE); } }); animator.start(); } private ValueAnimator createAnim(final View view, int start, int end) { ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int value = (int) animation.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); layoutParams.height = value; view.setLayoutParams(layoutParams); } }); animator.setDuration(500); animator.setInterpolator(new LinearInterpolator()); return animator; }}布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="40dp" android:background="@color/colorPrimaryDark" android:orientation="horizontal"> </LinearLayout> <Button android:id="@+id/start_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="start" android:layout_alignParentBottom="true" /></RelativeLayout>效果:
2.悬浮球
代码:
public class SpeakingFloatView extends FrameLayout implements Animator.AnimatorListener{ private float mTouchX; private float mTouchY; private float x; private float y; private float mLastX; private float mLastY; private boolean isMove; private WindowManager mWindowManager; private WindowManager.LayoutParams mWindowManagerParams; private ImageView mFloatAnnouncer; private ImageView mFloatWave1; private ImageView mFloatWave2; private ImageView mFloatWave3; private ImageView mFloatBg; private AnimatorSet animatorSet1; private AnimatorSet animatorSet2; private AnimatorSet animatorSet3; public SpeakingFloatView(Context context, WindowManager windowManager, WindowManager.LayoutParams params) { super(context); mWindowManager = windowManager; mWindowManagerParams = params; LayoutInflater inflater=(LayoutInflater)(context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)); View view=inflater.inflate(R.layout.speaking_float_layout,this); mFloatAnnouncer = (ImageView) view.findViewById(R.id.floatview_announcer); mFloatWave1 = (ImageView) view.findViewById(R.id.floatview_wave1); mFloatWave2 = (ImageView) view.findViewById(R.id.floatview_wave2); mFloatWave3 = (ImageView) view.findViewById(R.id.floatview_wave3); mFloatBg = (ImageView) view.findViewById(R.id.floatview_bg); initAnimator(); } @Override public boolean onInterceptTouchEvent(MotionEvent event){ float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: isMove = false; mLastX = x; mLastY = y; mTouchX = x; mTouchY = y; break; case MotionEvent.ACTION_MOVE: int xDiff = (int) Math.abs(x - mLastX); int yDiff = (int) Math.abs(y - mLastY); if (xDiff > 5 || yDiff > 5) { isMove = true; } break; case MotionEvent.ACTION_UP: if (isMove) { isMove = false; } break; } return isMove; } @Override public boolean onTouchEvent(MotionEvent event) { Rect frame = new Rect(); getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; x = event.getRawX(); y = event.getRawY() - statusBarHeight; switch (event.getAction()) { case MotionEvent.ACTION_MOVE: float xDiff = Math.abs(event.getX() - mLastX); float yDiff = Math.abs(event.getY() - mLastY); if(xDiff >= 5||yDiff >= 5){ isMove=true; } if(isMove){ updateViewPosition(); } break; case MotionEvent.ACTION_UP: if(isMove){ updateViewPosition(); isMove = false; } mTouchX = mTouchY = 0; break; } return true; } @Override public void setOnClickListener(OnClickListener l) { mFloatBg.setOnClickListener(l); } private void updateViewPosition() { mWindowManagerParams.x = (int) (x - mTouchX); mWindowManagerParams.y = (int) (y - mTouchY); mWindowManager.updateViewLayout(this, mWindowManagerParams); } public void startAnimation(){ animatorSet1.start(); animatorSet2.start(); animatorSet3.start(); animatorSet3.addListener(this); } public void stopAnimation(){ animatorSet1.end(); animatorSet2.end(); animatorSet3.end(); } public void initAnimator(){ animatorSet1 = new AnimatorSet(); ObjectAnimator[] animator1 = new ObjectAnimator[6]; animator1[0] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",0.45f,0.75f).setDuration(80); animator1[1] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",0.75f,0.75f).setDuration(160); animator1[2] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",0.75f,0.55f).setDuration(160); animator1[3] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",0.55f,1f).setDuration(80); animator1[4] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",1f,1f).setDuration(720); animator1[5] = ObjectAnimator.ofFloat(mFloatWave1,"alpha",1f,0.45f).setDuration(200); for(int i=0;i<5;i++){ animatorSet1.play(animator1[i]).before(animator1[i+1]); } animatorSet2 = new AnimatorSet(); final ObjectAnimator[] animator2 = new ObjectAnimator[13]; animator2[0] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0f,0f).setDuration(40); animator2[1] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0f,0.60f).setDuration(80); animator2[2] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.60f,0.60f).setDuration(80); animator2[3] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.60f,0.35f).setDuration(160); animator2[4] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.35f,0.35f).setDuration(80); animator2[5] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.35f,1f).setDuration(80); animator2[6] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",1f,1f).setDuration(160); animator2[7] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",1f,0.50f).setDuration(160); animator2[8] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.5f,0.5f).setDuration(80); animator2[9] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.50f,0.85f).setDuration(120); animator2[10] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.85f,0.85f).setDuration(120); animator2[11] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0.85f,0f).setDuration(200); animator2[12] = ObjectAnimator.ofFloat(mFloatWave2,"alpha",0f,0f).setDuration(40); for(int i=0;i<12;i++){ animatorSet2.play(animator2[i]).before(animator2[i+1]); } animatorSet3 = new AnimatorSet(); ObjectAnimator[] animator3 = new ObjectAnimator[12]; animator3[0] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0f).setDuration(80); animator3[1] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0.45f).setDuration(80); animator3[2] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0.45f,0f).setDuration(160); animator3[3] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0f).setDuration(160); animator3[4] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,1f).setDuration(80); animator3[5] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",1f,1f).setDuration(80); animator3[6] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",1f,0f).setDuration(160); animator3[7] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0f).setDuration(160); animator3[8] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0.35f).setDuration(120); animator3[9] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0.35f,0.35f).setDuration(40); animator3[10] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0.35f,0f).setDuration(200); animator3[11] = ObjectAnimator.ofFloat(mFloatWave3,"alpha",0f,0f).setDuration(80); for(int i=0;i<11;i++){ animatorSet3.play(animator3[i]).before(animator3[i+1]); } } @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { animatorSet1.start(); animatorSet2.start(); animatorSet3.start(); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { }}
布局:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageView android:id="@+id/floatview_bg" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/speaking_floatview_bg" android:layout_gravity="center"/> <ImageView android:id="@+id/floatview_wave1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/floatview_wave_3" android:layout_gravity="center"/> <ImageView android:id="@+id/floatview_wave2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/floatview_wave_2" android:layout_gravity="center"/> <ImageView android:id="@+id/floatview_wave3" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/floatview_wave_1" android:layout_gravity="center"/> <ImageView android:id="@+id/floatview_announcer" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/floatview_announcer_4" android:layout_gravity="center"/></FrameLayout>
阅读全文
0 0
- 属性动画的使用实例
- 属性动画的使用
- 属性动画的使用
- 属性动画的使用
- 属性动画的使用
- 属性动画和帧动画的使用
- android属性动画的使用
- 属性动画的基本使用
- Android 属性动画的使用
- 属性动画的简单使用
- 属性动画的简单使用
- 组合属性动画的使用
- CABasicAnimation(基础属性动画)的简单使用
- android 属性动画 AnimatorSet的使用
- 属性动画ValueAnimator和ObjectAnimator的使用
- 属性动画的简单使用和总结
- 浅谈属性动画的简单使用(一)
- Android属性动画的基本使用
- 如何用JMeter对MySQL数据库进行压测?
- 7.18 思考关于意志力
- POJ-2031 最小生成树(prim算法)
- Spark JobServer实例以及上传运行
- TensorFlow学习日记5
- 属性动画的使用实例
- OOA、OOD、OOP 代表什么
- python中的self
- Hadoop
- uva11400--Lighting System Design DP
- Command /usr/bin/codesign failed with exit code 1
- 注释
- Hadoop-Streaming(流)
- Linq利用Distinct去除重复项(可自己指定)