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 ...
随机推荐
- HDU4287
Intelligent IME Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- python学习之老男孩python全栈第九期_day001作业
1.使用while循环输入 1 2 3 4 5 6 8 9 10 count = 0 while count <= 9: count += 1 if count == 7:continu ...
- 2017-07-20 在Maven Central发布中文API的Java库
知乎原链 相关问题: 哪些Java库有中文命名的API? 且记下随想. 之前没有发布过, 看了SO上的推荐:Publish a library to maven repositories 决定在son ...
- 【读书笔记】iOS-设计模式
一个可复用的解决方案,用于处理特定场景下的常见问题.一种设计模式并不是一个可以直接转化为代码的已完工设计.它是对于如何解决问题的一种描述或者模板,可以用在许多不同的场合. 参考资料:<iOS W ...
- UDP学习总结
1.UDP的优势是什么?有哪些典型的应用是使用UDP的?为什么? 2.
- 安卓开发_浅谈Fragment之ListFragment
ListFragment,即Fragment的一个子类,当我们用的一个Fragment只需要一个listview视图的时候使用 该类有几个特点: 1.ListFragment 本身具只有一个ListV ...
- Android WIFI的基本操作
WIFI管理类 class WifiConnector { private ExecutorService executors; Handler mHandler; WifiManager wifiM ...
- 贝塞尔曲线UIBezierPath简单使用
//常用属性 /* 1.CGPath: 将UIBezierPath类转换成CGPath 2.currentPoint: 当前path的位置,可以理解为path的终点 3.lineWidth: 线条宽度 ...
- jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本
-----业务场景中经常涉及到联查,jpa的hql语法提供了内连接的查询方式(不支持复杂hql,比如left join ,right join). 上代码了 1.我们要联查房屋和房屋用户中间表,通过 ...
- RabbitMQ延迟消息学习
准备做一个禁言自动解除的功能,立马想到了订单的超时自动解除,刚好最近在看RabbitMQ的实现,于是想用它实现,查询了相关文档发现确实可以实现,动手编写了这篇短文. 准备工作 1.Erlang安装请参 ...