自定义加载进度动画
2014-03-30 21:10
351 查看
一、还是老惯例,不多说,先上图
二、创建一个类继承View
Ⅰ、实现带参数的构造方法ProgressImage(Context context, AttributeSet attrs)
Ⅱ、重写onDraw(Canvas canvas)方法
Ⅲ、重写onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法
package net.dxs.baihedemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class ProgressImage extends ImageView {
private Drawable maskDraw;
/**
* 加载的进度
* 0-100
*/
private int mProcess = 20;
public ProgressImage(Context context, AttributeSet attrs) {
super(context, attrs);
maskDraw = context.getResources().getDrawable(R.drawable.red_bg);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//保存当前画笔的状态
canvas.save();
int topline = (int) (getHeight() - getHeight() * getmProcess() / 100);
/*
* canvas 剪切出一个区域,使在这个区域里面的内容是有效的,区域之外是无效的。
*/
canvas.clipRect(0, topline, getWidth(), getHeight());
maskDraw.draw(canvas);
//恢复到之前保存的状态
canvas.restore();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
maskDraw.setBounds(0, 0, getWidth(), getHeight());
}
public float getmProcess() {
return mProcess;
}
/**
* 设置新的进度以后,自动刷新
*/
public void setProgress(int mProcess) {
if (mProcess > 100) {
this.mProcess = 100;
}
if (mProcess < 0) {
this.mProcess = 0;
}
this.mProcess = mProcess;
invalidate();
}
}
三、调用
使用handler实现回调
package net.dxs.baihedemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
public class ProImageActivity extends Activity {
private ProgressImage piv;
private int pivDeep = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pro_image_test);
piv = (ProgressImage) findViewById(R.id.my_pro_iv);
handler.sendEmptyMessage(2);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
piv.setProgress(pivDeep);
break;
case 2:
new Thread() {
public void run() {
while (true) {
pivDeep = (pivDeep + 5) % 100;
handler.sendEmptyMessage(1);
SystemClock.sleep(200);
}
};
}.start();
break;
}
}
};
}
四、布局代码
添加自定义的view
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<net.dxs.baihedemo.ProgressImage
android:id="@+id/my_pro_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/gray_bg" />
</LinearLayout>
到这里就搞定了,
主要使用了canvas.clipRect剪切方法
二、创建一个类继承View
Ⅰ、实现带参数的构造方法ProgressImage(Context context, AttributeSet attrs)
Ⅱ、重写onDraw(Canvas canvas)方法
Ⅲ、重写onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法
package net.dxs.baihedemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class ProgressImage extends ImageView {
private Drawable maskDraw;
/**
* 加载的进度
* 0-100
*/
private int mProcess = 20;
public ProgressImage(Context context, AttributeSet attrs) {
super(context, attrs);
maskDraw = context.getResources().getDrawable(R.drawable.red_bg);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//保存当前画笔的状态
canvas.save();
int topline = (int) (getHeight() - getHeight() * getmProcess() / 100);
/*
* canvas 剪切出一个区域,使在这个区域里面的内容是有效的,区域之外是无效的。
*/
canvas.clipRect(0, topline, getWidth(), getHeight());
maskDraw.draw(canvas);
//恢复到之前保存的状态
canvas.restore();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
maskDraw.setBounds(0, 0, getWidth(), getHeight());
}
public float getmProcess() {
return mProcess;
}
/**
* 设置新的进度以后,自动刷新
*/
public void setProgress(int mProcess) {
if (mProcess > 100) {
this.mProcess = 100;
}
if (mProcess < 0) {
this.mProcess = 0;
}
this.mProcess = mProcess;
invalidate();
}
}
三、调用
使用handler实现回调
package net.dxs.baihedemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
public class ProImageActivity extends Activity {
private ProgressImage piv;
private int pivDeep = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pro_image_test);
piv = (ProgressImage) findViewById(R.id.my_pro_iv);
handler.sendEmptyMessage(2);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
piv.setProgress(pivDeep);
break;
case 2:
new Thread() {
public void run() {
while (true) {
pivDeep = (pivDeep + 5) % 100;
handler.sendEmptyMessage(1);
SystemClock.sleep(200);
}
};
}.start();
break;
}
}
};
}
四、布局代码
添加自定义的view
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<net.dxs.baihedemo.ProgressImage
android:id="@+id/my_pro_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/gray_bg" />
</LinearLayout>
到这里就搞定了,
主要使用了canvas.clipRect剪切方法
相关文章推荐
- Android自定义带加载动画效果的环状进度条
- Android 自定义View修炼-自定义加载进度动画XCLoadingImageView
- android开发过程中自定义动画加载进度条实现过程
- Android自定义View二(加载进度动画)
- 自定义水波纹加载进度动画--葫芦
- 绘图与动画之使用自定义属性与颜色渐变实现色带加载动画
- Android自定义View-圆形加载进度条
- Android上拉刷新下拉加载XRefreshView集成以及自定义GIF动画
- Android自定义加载动画的实现
- android自定义加载数据动画dialog和简单的timer计时器
- 自定义圆形带颜色的加载进度条
- js(jquery)网页进度条加载n中办法和原理(也有css3动画进度条)
- android自定义view之加载动画ColorBall
- 简单实现的自定义圆环进度条,可使用于文件的上传下载图片加载等地方.
- Android自定义类似ProgressDialog效果加载动画
- 自定义动画(仿Win10加载动画)
- Android 自定义加载等待动画
- 自定义加载动画
- 自定义加载进度圆环(可以设置加载百分比的那种)
- 自定义ListView加载动画,实现不一样的加载效果