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();
}
}
Android 绘制一个Loading动画__向图片中缓慢填充颜色,从而形成动画效果的更多相关文章
- Android 利用属ObjectAnimator,AnimatorSet性动画绘制一个弹球,加速下落,到底部时挤压,然后减速上弹
属性动画主要的几个类介绍: 1.ValueAnimator:这个类提供了一个简单的计时引擎运行动画动画计算值和设置目标对象.注意:使用该类时一般都是用:ObjectAnimator,而基于Object ...
- Android中使用Canvas和Paint绘制一个安卓机器人
场景 在Android中画笔使用Paint类,画布使用Canvas类来表示. 绘图的基本步骤 首先编写一个继承自View的自定义View类,然后重写其onDraw方法,最后把自定义的view添加到ac ...
- Android绘制优化(一)绘制性能分析
前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...
- Android:一个高效的UI才是一个拉风的UI(二)
趁今晚老大不在偷偷早下班,所以有时间继续跟大伙扯扯UI设计之痛,也算一个是对上篇<Android:一个高效的UI才是一个拉风的UI(一)>的完整补充吧.写得不好的话大家尽管拍砖~(来!砸死 ...
- Android系统编程入门系列之界面Activity响应丝滑的传统动画
上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化.然而不管是启动一个界面执行新界 ...
- IOS 中openGL使用教程2(openGL ES 入门篇 | 绘制一个多边形)
在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...
- android绘制view的过程
1 android绘制view的过程简单描述 简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw): 下面看看每一步的动作到底是 ...
- 【转】Android绘制View的过程研究——计算View的大小
Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...
- Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation
程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...
随机推荐
- linux shell脚本之-变量极速入门与进阶(2)
1,$$:显示当前的进程id号 ghostwu@dev:~/linux/shell/how_to_use_var$ cat show_pid.sh #!/bin/bash echo $$ ghostw ...
- 判断api请求方式
$curl_request = $_SERVER['REQUEST_METHOD']; //获取请求方式 if($curl_request == 'POST'){ echo post; }else i ...
- Design--源自生活美学的色彩搭配网站(design-seeds)
All the flowers of all the tomorrows are in the seeds of today. 色彩搭配网站--design-seeds.com // 所有的颜色值都是 ...
- Python全栈学习_day003作业
day3作业及默写 1,有变量name = "aleX leNb" 完成如下操作: 1) 移除 name 变量对应的值两边的空格,并输出处理结果 print(name.strip( ...
- c语言学习笔记-switch
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.switch函数意义 选择性执行 二.switch函数结构 switch(表达式) { case: 常量表达式; 语句1; ...
- python 类函数,实例函数,静态函数
一.实现方法 class Function(object): # 在类定义中定义变量 cls_variable = "class varibale" def __init__(se ...
- Twitter基于R语言的时序数据突变检测(BreakoutDetection)
Twitter开源的时序数据突变检测(BreakoutDetection),基于无参的E-Divisive with Medians (EDM)算法,比传统的E-Divisive算法快3.5倍以上,并 ...
- loadrunner 脚本开发-int型变量和字符串的相互转换
脚本开发-int型变量和字符串的相互转换 by:授客 QQ:1033553122 字符串转化为int型变量 Action2() { int j = 0; j = atoi("12345&qu ...
- (网页)js最新手机号码、电话号码正则表达式
正则表达式(regular expression)是一个描述字符模式的对象.使用JavaScript正则表达式可以进行强大的模式匹配和文本检索与替换功能. 手机号码正则表达式验证. function ...
- ORACLE11g下如何利用SQL DEVELOPER连接上数据库
最近在学习数据库的相关内容,在sqlplus敲了几天命令行窗口后,想尝试一下用sql developer 连接上数据库但一直没有实现.在网上查询了相关资料后现在终于弄好了,就来写下此篇博文与大家分享! ...