Android圓形散開動畫
阿新 • • 發佈:2019-01-04
2.3 專案下載package com.example.animationbutton; import android.app.Activity; import android.content.Context; import android.graphics.PointF; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.WindowManager; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.LinearInterpolator; import android.widget.ImageView; import android.widget.RelativeLayout; import com.nineoldandroids.animation.AnimatorSet; import com.nineoldandroids.animation.ObjectAnimator; import com.nineoldandroids.animation.TypeEvaluator; import com.nineoldandroids.animation.ValueAnimator; import com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener; public class MainActivity extends Activity { /** * 頭像。 */ private ImageView imageview; /** * 螢幕寬度。 */ private int window_width; /** * 螢幕高度。 */ private int window_height; /** * 圓型按鈕的寬度。 */ private int image_width; /** * 五角星。 */ private ImageView wujiaoxing; /** * 星品。 */ private ImageView shop; /** * 粉絲圈。 */ private ImageView fans; /** * 星蹤跡。 */ private ImageView news; /** * 星表情。 */ private ImageView expression; /** * 星動時刻。 */ private ImageView trails; /** * 星盟logo。 */ private ImageView istar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 設定全屏。 // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, // WindowManager.LayoutParams.FLAG_FULLSCREEN); final View view = View.inflate(this, R.layout.activity_main, null); setContentView(view); AlphaAnimation aa = new AlphaAnimation(0.7f, 1.0f); aa.setDuration(500); view.startAnimation(aa); aa.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation arg0) { // ObjectAnimator fadeIn = ObjectAnimator.ofFloat(imageview, // "alpha", 0f, 1f); int startangle = 54; int length = (int) ((window_width / (Math.sin(72 * Math.PI / 180)) - image_width) / 2 - image_width / 5); ValueAnimator expressionanim = zhixian(expression, startangle, length); ValueAnimator trailsanim = zhixian(trails, startangle + 72, length); ValueAnimator newsanim = zhixian(news, startangle + (72 * 2), length); ValueAnimator shopanim = zhixian(shop, startangle + (72 * 3), length); ValueAnimator fansanim = zhixian(fans, startangle + (72 * 4), length); AnimatorSet animSet = new AnimatorSet(); ObjectAnimator fadeIn = ObjectAnimator.ofFloat(imageview, "alpha", 0f, 1f); ObjectAnimator fadeOut = ObjectAnimator.ofFloat(istar, "alpha", 1f, 0f); animSet.playTogether(fadeIn, fadeOut, shopanim, fansanim, newsanim, expressionanim, trailsanim); animSet.setDuration(1000); animSet.start(); } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationStart(Animation animation) { } }); WindowManager wm = (WindowManager) getBaseContext().getSystemService( Context.WINDOW_SERVICE); window_width = wm.getDefaultDisplay().getWidth(); window_height = wm.getDefaultDisplay().getHeight() - 20; image_width = window_width / 4; imageview = (ImageView) findViewById(R.id.head); RelativeLayout.LayoutParams paras = new RelativeLayout.LayoutParams( image_width, image_width); paras.leftMargin = window_width / 2 - image_width / 2; paras.topMargin = window_height / 2 - image_width / 2; imageview.setLayoutParams(paras); wujiaoxing = (ImageView) findViewById(R.id.wujiaoxing); RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); // , 1是可選寫的 lp.setMargins(image_width * 5 / 8, 0, image_width * 5 / 8, 0); wujiaoxing.setLayoutParams(lp); initbuttons(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); } /** * 沿直線運動。 * * @param view * 要移動的物件。 * @param direction * 方向 +1 正方形,-1 負方向。 * @param length */ public ValueAnimator zhixian(final View view, final int angle, final int length) { ValueAnimator valueAnimator = new ValueAnimator(); valueAnimator.setObjectValues(new PointF(0, 0)); valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.setEvaluator(new TypeEvaluator<PointF>() { // fraction = t / duration @Override public PointF evaluate(float fraction, PointF startValue, PointF endValue) { Log.v("znz", "znz ---> " + fraction); PointF point = new PointF(); point.x = (float) (fraction * length * Math.cos(angle * Math.PI / 180)); point.y = (float) (fraction * length * Math.sin(angle * Math.PI / 180)); return point; } }); valueAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { PointF point = (PointF) animation.getAnimatedValue(); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( image_width, image_width); params.leftMargin = (int) point.x + (window_width / 2 - image_width / 2); // Your // coordinate params.topMargin = (int) point.y + (window_height / 2 - image_width / 2); // Your Y // coordinate Log.v("znz", "point.x ---> " + point.x); Log.v("znz", "point.y ---> " + point.y); view.setLayoutParams(params); } }); return valueAnimator; } /** * 初始化五顆按鈕。 */ private void initbuttons() { shop = (ImageView) findViewById(R.id.shop); fans = (ImageView) findViewById(R.id.fans); news = (ImageView) findViewById(R.id.news); expression = (ImageView) findViewById(R.id.expression); trails = (ImageView) findViewById(R.id.trails); istar = (ImageView) findViewById(R.id.istartlogo); RelativeLayout.LayoutParams paras = new RelativeLayout.LayoutParams( image_width, image_width); // Your coordinate paras.leftMargin = window_width / 2 - image_width / 2; // Your Y coordinate paras.topMargin = window_height / 2 - image_width / 2; shop.setLayoutParams(paras); fans.setLayoutParams(paras); news.setLayoutParams(paras); expression.setLayoutParams(paras); trails.setLayoutParams(paras); istar.setLayoutParams(paras); } }