Android 绘制一个Loading动画__向图片中缓慢填充颜色,从而形成动画效果

Android 绘制一个Loading动画__向图片中缓慢填充颜色,从而形成动画效果

需求:制作一个加载动画,向一个不规则图片图形中从从下到上依次填充颜色,形成动画效果。

效果如下:

   

代码如下:

LoadingAnimatorView.java

复制代码
package cn.yw.lib.animation;

import cn.yw.lib.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class LoadingAnimatorView extends SurfaceView implements
        SurfaceHolder.Callback, Runnable {
    private SurfaceHolder holder;
    private Bitmap bitmap;
    private Paint paint1;
    private Paint paint2;
    public boolean flag = true;
    private int y = 100;

    public LoadingAnimatorView(Context context) {
        super(context);
        this.setFocusable(true);
        this.setFocusableInTouchMode(true);
        holder = this.getHolder();
        holder.addCallback(this);
        paint1 = new Paint();
        paint1.setColor(Color.RED);
        paint2 = new Paint();
        paint2.setColor(Color.GRAY);
        Bitmap bitmap1 = BitmapFactory.decodeStream(context.getResources()
                .openRawResource(R.drawable.ic_launcher));
        bitmap = bitmap1.extractAlpha();// 获取一个透明图片
        y = bitmap.getWidth();//初始化y轴坐标
    }
  //改变裁剪区域
    private void playAnimator() {
        if (y > 0) {
            y-=3;
        }
    }
    
    private void drawLoadingAnimator() {
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            if(canvas != null){
                canvas.drawBitmap(bitmap, 100, 100,null);
                canvas.drawColor(Color.GREEN);
                canvas.drawBitmap(bitmap, 100, 100, paint2);
                canvas.save();
          //裁剪
                canvas.clipRect(100, y+100, bitmap.getWidth()+100,
                        bitmap.getHeight()+100);
                canvas.drawBitmap(bitmap, 100, 100, paint1);
                canvas.restore();
            }
            /*
             * Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
             * Rect dst = new Rect(100, 100, bitmap.getWidth()+100, y+100);
             * canvas.drawBitmap(bitmap, src, dst, paint2);
             */
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try{
                if (holder != null) {
                    holder.unlockCanvasAndPost(canvas);
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        new Thread(this).start();//开启绘制线程
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
  //绘制动画线程
    @Override
    public void run() {
        while (flag) {
            drawLoadingAnimator();
            playAnimator();
            try {
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
复制代码

LoadingAnimatorActivity.java

复制代码
package cn.yw.lib.animation;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;

@SuppressLint("NewApi")
public class LoadingAnimatorActivity extends Activity{
    private LoadingAnimatorView view;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        view = new LoadingAnimatorView(this);
        setContentView(view);
    }
    @Override
    public void onBackPressed() {
        view.flag = false;//结束绘制线程
        super.onBackPressed();
    }
}
复制代码
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值