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

效果如下:

   

代码如下:

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();
}
}

Android 绘制一个Loading动画__向图片中缓慢填充颜色,从而形成动画效果的更多相关文章

  1. Android 利用属ObjectAnimator,AnimatorSet性动画绘制一个弹球,加速下落,到底部时挤压,然后减速上弹

    属性动画主要的几个类介绍: 1.ValueAnimator:这个类提供了一个简单的计时引擎运行动画动画计算值和设置目标对象.注意:使用该类时一般都是用:ObjectAnimator,而基于Object ...

  2. Android中使用Canvas和Paint绘制一个安卓机器人

    场景 在Android中画笔使用Paint类,画布使用Canvas类来表示. 绘图的基本步骤 首先编写一个继承自View的自定义View类,然后重写其onDraw方法,最后把自定义的view添加到ac ...

  3. Android绘制优化(一)绘制性能分析

    前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...

  4. Android:一个高效的UI才是一个拉风的UI(二)

    趁今晚老大不在偷偷早下班,所以有时间继续跟大伙扯扯UI设计之痛,也算一个是对上篇<Android:一个高效的UI才是一个拉风的UI(一)>的完整补充吧.写得不好的话大家尽管拍砖~(来!砸死 ...

  5. Android系统编程入门系列之界面Activity响应丝滑的传统动画

    上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化.然而不管是启动一个界面执行新界 ...

  6. IOS 中openGL使用教程2(openGL ES 入门篇 | 绘制一个多边形)

    在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...

  7. android绘制view的过程

    1 android绘制view的过程简单描述  简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw):            下面看看每一步的动作到底是 ...

  8. 【转】Android绘制View的过程研究——计算View的大小

    Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...

  9. Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation

    程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...

随机推荐

  1. Oracle总结二

    1 where子句 Where子句的作用:用where子句来指定查询条件 1.1 用法示例 select * from emp where deptno=10; select * from emp w ...

  2. MySql Host is blocked because of many connection errors; unblock with 'mysqladmi

    原因: 同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞: 解决方法: 1.提高允许的max_connection_e ...

  3. 【代码笔记】Web-HTML-颜色

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. 安卓开发_浅谈DatePicker(日期选择器)

    DatePicker继承自FrameLayout类,日期选择控件的主要功能是向用户提供包含年.月.日的日期数据并允许用户对其修改.如果要捕获用户修改日期选择控件中的数据事件,需要为DatePicker ...

  5. 重写EasyUI的$.fn.datagrid.defaults.editors

    $.extend($.fn.datagrid.defaults.editors, { numberbox: { init: function (container, options) { var in ...

  6. 开发测试技巧|辅助开发调试:goolge浏览器利用F12在控制台输入脚本实现表单自动填充

    一个开发测试技巧的指引和截图,利用google浏览器的F12调试和Console执行,注入JavaScript脚本实现表单的自动填充和测试. 原文链接: http://www.lookdaima.co ...

  7. fedora添加ntfs文件系统支持

    ntfs支持(安装后不能打开,重启) 如果没有换源先看一下换源. 查找库中是否有ntfs-3g. [root@bogon zhujikuan]# yum search ntfs 上次元数据过期检查:0 ...

  8. 【hexo】01安装

    什么是 Hexo? Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页. 安装前提 安装 Hexo 相当简 ...

  9. python 从外部获取传入的参数

    有时候我们在执行python程序的时需要接收到外部传入的参数 python的 sys.argv[]就能实现 # test.py import sys #引入模块 str = sys.argv[1]pr ...

  10. Linux 小知识翻译 - 「虚拟化技术」

    这次聊聊「虚拟化技术」. 虚拟化技术,有时简称为「虚拟化」,最近经常听人说它.但是却不太清楚它的意思.到底虚拟了什么东西?本来是用来干什么的? 有名的虚拟化软件要数 VMware 和 VirtualB ...