此篇文章简单讲解下如何用自定义view将一张bitmap绘制在屏幕上
- 将一张bitmap显示可以用ImageView的setImageBitmap(bm);这里我们为了熟悉自定义view的用法和绘制工具,以绘制bitmap为例子。
(绘制UI需了解下三个绘图工具类Paint,Canvas,Path)
1.我们创建一个Mview类继承自View
public class Mview extends View {
private Paint mpaint; //定义一个画笔
private Canvas mCanvas; //定义一个画布
private Bitmap mBitmap; //定义一个Bitmap
//重写构造方法
public Mview(Context context) {
super(context);
init();
}
public Mview(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
//进行初始化操作
private void init()
{
mpaint=new Paint();
mBitmap= BitmapFactory.decodeFile("/storage/emulated/0/1.webp");//得到bitmap
}
//UI绘制代码在onDraw里
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBitmap,0,0,mpaint);//调用Canvas类的drawBitmap()即可绘制bitmap。
}
}
2.在layout中即可加入自定义的View
- 在Activity中使用此View的方法就和使用Button,ImageView控件一样。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.you.viewdemo1.MainActivity">
<com.example.you.viewdemo1.Mview
android:id="@+id/mView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
3.如果我们要不断刷新UI怎么办?
-
我们可以调用View的invalidate() ,postInvalidate() 方法,每调用一次便会执行一次onDraw()方法,以此实现UI刷新。
-
postInvalidate(); 与invalidate()方法区别就是,postInvalidate()方法可以在UI线程执行,也可以在工作线程执行
而invalidate()只能在UI线程操作。但是从重绘速率讲:invalidate()效率高。
我们用具体实例体验下用自定义view进行UI刷新
- 我们用7张爆炸图片来实践,在屏幕上显示爆炸的动态效果(即不断循环显示1-7的图片,速度足够快时就是连续的画面)
- 我们在前面的Mview类中加入setmBitmap()方法以改变bitmap
public void setmBitmap(Bitmap get_bitmap)
{
this.mBitmap=get_bitmap;
}
- 在Activity中我们新开一个线程用来刷新UI
new Thread(new Runnable() {
@Override
public void run() {
//我们用一个循环不断更新bitmap并进行重绘
//不断改变i从1到7
for(int i=1;i<8;i++)
{
// 每次获取对应i名字的图片并赋给bitmap
new_bitmap= BitmapFactory.decodeFile("/storage/emulated/0/"+i+".png");
//调用Mview中setmBitmap设置新得到的bitmap
mview.setmBitmap(new_bitmap);
//重绘为当前bitmap
mview.postInvalidate();
if(i==7)
i=0;
}
}
}).start();
启动app我们便可在手机上看到连续的爆炸画面,实现了UI刷新
网友评论