本文实例讲述了Android开发中自定义ProgressBar控件的方法。分享给大家供大家参考,具体如下: 很简单,首先加载Drawable,在onMeasure设置好其区域大小, 然后使用canvas.clipRect绘图 public class ProgressView extends ImageView { private Drawable maskDraw; /** * 加载的进度 0-100 */ private int mProcess = 20; public ProgressView(Context context, AttributeSet a 在Android开发中,有时我们需要对系统提供的控件进行自定义以满足特定的界面设计或功能需求。本实例将详细介绍如何自定义一个`ProgressBar`控件,即`ProgressView`。这个自定义控件继承自`ImageView`,并利用`Canvas`的`clipRect`方法来绘制进度条。 我们创建一个名为`ProgressView`的类,继承自`ImageView`。在类中定义两个成员变量:`Drawable`类型的`maskDraw`用于存储进度条背景,以及`int`类型的`mProcess`用于存储当前进度(范围为0-100)。 ```java public class ProgressView extends ImageView { private Drawable maskDraw; private int mProcess = 20; // 构造函数,初始化maskDraw public ProgressView(Context context, AttributeSet attrs) { super(context, attrs); maskDraw = context.getResources().getDrawable(R.drawable.red_bg); } } ``` 接下来,我们重写`onDraw`方法,这是自定义控件绘图的关键。在`onDraw`中,首先调用`super.onDraw()`以执行父类的绘图逻辑,然后使用`canvas.save()`保存当前画笔状态。接着,计算进度条的高度并使用`canvas.clipRect`方法剪切出一个区域,使得该区域内绘制的内容是可见的,区域外的内容被隐藏。调用`maskDraw.draw(canvas)`绘制进度条,并通过`canvas.restore()`恢复之前的画笔状态。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); int topline = (int) (getHeight() - getHeight() * getProcess() / 100); canvas.clipRect(0, topline, getWidth(), getHeight()); maskDraw.draw(canvas); canvas.restore(); } ``` 为了确定控件的尺寸,我们需要重写`onMeasure`方法,设置`maskDraw`的边界。 ```java @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); maskDraw.setBounds(0, 0, getWidth(), getHeight()); } ``` 我们还提供了一个`getProcess`方法获取当前进度,以及一个`setProgress`方法设置进度并自动刷新视图。 ```java public float getProcess() { return mProcess; } public void setProgress(int mProcess) { if (mProcess > 100) { this.mProcess = 100; } else if (mProcess < 0) { this.mProcess = 0; } else { this.mProcess = mProcess; } invalidate(); } ``` 在`Activity`中,我们可以创建一个`ProgressView`实例,并通过`Handler`来动态改变进度。 ```java public class ProgressActivity extends Activity { private ProgressView piv; private int pivDeep = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progressview); piv = (ProgressView) 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); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); break; default: break; } } }; } ``` 通过这种方式,我们可以看到一个动态变化的进度条效果。`Handler`发送消息更新进度,线程不断改变`pivDeep`值,然后通过`setProgress`更新`ProgressView`的显示。 总结一下,自定义`ProgressBar`控件主要涉及以下几个关键点: 1. 继承适当的基类:在这里,我们选择了`ImageView`作为基础,因为我们可以直接使用`Drawable`作为进度条的背景。 2. 重写`onDraw`方法:根据进度绘制进度条,使用`canvas.clipRect`来控制可见区域。 3. 重写`onMeasure`方法:确保控件的尺寸正确。 4. 提供方法来设置和获取进度:`setProgress`和`getProcess`。 5. 在`Activity`中通过`Handler`实现动态更新:在后台线程改变进度,然后通过消息机制通知UI线程更新显示。 这种自定义`ProgressBar`的方法具有很高的灵活性,可以根据实际需求调整进度条样式、颜色等属性,以适应各种复杂的界面设计。同时,通过理解这一过程,开发者可以更好地掌握Android自定义控件的原理和实践。
- 粉丝: 5
- 资源: 907
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0