动画研究二

了解了动画的基本知识,那么就可以开始实践了。最简单的动画做起,而项目中又经常遇到的,加载动画当然是不二的选择,下面就说一说一个圆圈来回摆动的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();
  }
}


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

你可能感兴趣的:(动画研究二)