根据列表内容,我们第一个将要学习的是如何通过三种方式绘制图片,废话不说拿起你们的键盘,我们现在就开始新的学习。
首先我们先列举出我们本篇文章将通过以下三种方式将图片绘制的到界面中
1.通过ImageView绘制图片
2.通过自定义View绘制图片
3.通过SurfaceView绘制图片
1.ImageView绘制图片
话不多说我们现在先来实现第一种方式。
我们先创建一个工程来实现我们今天要编写的Demo。
ps.创建工程我在这就不过多的复述了。
首先我们在xml文件中创建ImageView
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
再在Activity中去实现图片绘制
mImg = findViewById(R.id.img);
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "test.jpg");
mImg.setImageBitmap(bitmap);
这样我们就完成了第一种图片绘制。
2.自定义View绘制图片
对自定义控件熟悉的小伙伴,自定义View是集成View或者ViewGroup来实现我们自己想要的控件,对自定义控件不熟悉的小伙伴也不用怕,本章涉及自定义控件的知识非常的浅,我们先来看下代码吧。
public class PicView extends View {
private Paint paint;
private Bitmap bitmap;
public PicView(Context context) {
this(context, null);
}
public PicView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public PicView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
paint = new Paint();
paint.setAntiAlias(true);//是否抗锯齿
bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "test.jpg");
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
}
首先我们先创建了一个PicView 的类使其继承View
然后我们可以看到我们所实现的三个构造方法最终都会指向第三个构造方法,这样无论如何都会走init()方法了。
在init()方法中咱们做了哪些操作
paint = new Paint();
paint.setAntiAlias(true);//是否抗锯齿
init里面我们一开始就将画笔(Paint)初始化,将画笔设置成抗锯齿。ps:记住画笔是不可以在onDraw中去实现的哦!(画笔的具体用法在这我就不过多的描述,需要了解的小伙伴可以自行百度)
bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "test.jpg");
至于获取bitmap这句代码,纯粹是我自己偷懒这么写的,嘿嘿~,大家要是想写的好点可以自己写个setBitmap(Bitmap bitmap)的方法,然后调用Invalidate()方法,使自定View重新执行OnDraw()方法。
我们再来看看onDraw(Canvas canvas)这个方法
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
在OnDraw方法中有个Canvas的参数,Canvas是个什么呢?Canvas翻译过来是画布的意思,还记得我们刚刚在init方法中初始化了Paint(画笔)这个对象吗?现在我们有了画笔和画布,我下一步要做的就是在画布上使用画笔将我们想看到的图片(Bitmap)绘制出来即可。
canvas.drawBitmap(bitmap, 0, 0, paint);
第二种方式也完结了,是不是很快呢?接下来就是最后一种方式了~
3.SurfaceView绘制图片
还是一样在Xml中创建一个SurfaceView
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
然后再去Activity中实现绘制
mSurfaceView = findViewById(R.id.surface_view);
mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (holder != null) {
//初始化画笔
Paint paint = new Paint();
paint.setAntiAlias(true);//是否抗锯齿
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "test.jpg");
Canvas canvas = holder.lockCanvas();//锁定画布
canvas.drawBitmap(bitmap, new Matrix(), paint);
holder.unlockCanvasAndPost(canvas);//解锁
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});