了解了动画的基本知识,那么就可以开始实践了。最简单的动画做起,而项目中又经常遇到的,加载动画当然是不二的选择,下面就说一说一个圆圈来回摆动的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(); } }
这样一个加载框就出炉了,实际项目中肯定会遇到,而且很多时候都会比这个复杂。