动画研究二

来源:互联网 发布:生命数组 编辑:程序博客网 时间:2024/06/09 20:58

了解了动画的基本知识,那么就可以开始实践了。最简单的动画做起,而项目中又经常遇到的,加载动画当然是不二的选择,下面就说一说一个圆圈来回摆动的loading dialog。


来回摆动的圆圈代码如下:


package com.avz.lawson.avengerzz.ui.view.loading;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.Animation;import android.view.animation.TranslateAnimation;import com.avz.lawson.avengerzz.R;/** * Created by lawson on 16/2/27. */public class LoadingCircle extends View {  private Paint paint;  private int width;  private int height;  private float border;  public LoadingCircle(Context context) {    super(context);    initView();  }  public LoadingCircle(Context context, AttributeSet attrs) {    super(context, attrs);    initView();  }  public LoadingCircle(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    initView();  }  private void initView() {    paint = new Paint();    paint.setColor(getResources().getColor(R.color.light_gray));    border = getResources().getDimension(R.dimen.loading_circle_border);    paint.setAntiAlias(true);    paint.setStyle(Paint.Style.FILL);  }  @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {    super.onSizeChanged(w, h, oldw, oldh);    width = w;    height = h;  }  public void start() {    TranslateAnimation animation = new TranslateAnimation(-border, border, 0, 0);    animation.setInterpolator(new AccelerateDecelerateInterpolator());    animation.setRepeatMode(Animation.REVERSE);    animation.setRepeatCount(Animation.INFINITE);    animation.setDuration(500);    animation.setStartOffset(0);    animation.setAnimationListener(new Animation.AnimationListener() {      @Override public void onAnimationStart(Animation animation) {      }      @Override public void onAnimationEnd(Animation animation) {      }      @Override public void onAnimationRepeat(Animation animation) {      }    });    startAnimation(animation);  }  public void stop() {    clearAnimation();  }  @Override protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    canvas.drawCircle(width / 2, height / 2, width / 2, paint);  }}


比较基本的思路就是,先画好圆圈的位置,再让它来回摆就行了。而其中摆动动画的部分就不多说了,肯定需要永远重复下去,直到取消加载。而光有它还不够,还得有一个放这个view的dialog,用于dialog相关的需求,比如周围变暗,或者周边区域点击不能取消等等。


加载框代码如下:


package com.avz.lawson.avengerzz.ui.view.loading;import android.app.Dialog;import android.content.Context;import com.avz.lawson.avengerzz.R;/** * Created by lawson on 16/2/23. */public class LoadingDialog extends Dialog {  private LoadingCircle loadingCircle;  public LoadingDialog(Context context) {    super(context, R.style.Avengerzz_Dialog_Transparent);    setCanceledOnTouchOutside(false);    setContentView(R.layout.layout_loading);    loadingCircle = (LoadingCircle) findViewById(R.id.loading_circle);  }  private void startLoading() {    loadingCircle.start();  }  private void stopLoading() {    loadingCircle.stop();  }  @Override public void show() {    super.show();    startLoading();  }  @Override public void dismiss() {    super.dismiss();    stopLoading();  }}


这样一个加载框就出炉了,实际项目中肯定会遇到,而且很多时候都会比这个复杂。

0 0
原创粉丝点击