Android 使用三种方式绘制一张图片
已经很久没写博客了,最近的flutter也挺火的,趁着最近工作的时候把项目都完结掉了以后顺便看着学了点,也看了下NDK的东西,尝试了一些简单的NDK 的入门,然后倍感无聊,因为NDK的资料在网上实在是少之又少,甚至是有点想放弃打算随缘了。。。。emmm感觉这辈子可能都很难接触到NDK的东西,突然,一个朋友给我推荐了下NDK的学习路线,开始转入音频学习。。。
然后给我发了一个学习任务单,也就是这位大神的 :http://blog.51cto.com/ticktick/1956269?source=dra
那么废话不多说,现在就开始进入正题
在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View
1、ImageView
这个。。。我想每个安卓开发都是必须要会的东西,很简单啊
imageView.setBackgroundResource(R.drawable.xxx);
2、SurfaceView
这个控件,我想在平时正常的开发中出现的频率还是挺高的,比如,大家都在用的zxing, 像我开发让我接入的xx云直播的时候也用到了这个。
那么,SurfaceView是什么呢?根据SDK的文档说明,他其实就是一个在窗口挖一个洞,他就显示在这个洞里,其他的View显示在窗口上,所以也可以显示在SurfaceView上。SurfaceView在绘制方面有着极其强大的功能,最重要的是它支持OpenGL ES库,2D和3D的效果都可以实现。其次,view的刷新都是在主线程上,而Surface的刷新可以由任何一个线程控制刷新,我们也可以控制他的生命周期,是一些高频率刷新视图的app提供了一个优秀的容器。
SurfaceView它的绘制原理是绘制前先锁定画布(获取画布),然后等都绘制结束以后在对画布进行解锁 ,最后在把画布内容显示到屏幕上。 我们需要实现他的SurfaceHolder.Callback方法,也就是对他的生命周期进行监听
//获取SurfaceView的视图控制器
SurfaceHolder holder = surfaceView.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (holder == null) {
return;
}
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xxx);
/*当surfaceHolder开始调用lockCanvas方法后开启一个同步锁
*保护在绘制中原来的内容不被改变
*当调用了unlockCanvasAndPost方法之后,才会通知surface开始绘制要改变的区域
*/
Canvas canvas = holder.lockCanvas();
canvas.drawBitmap(bitmap, 0, 0, paint);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
3、自定义View
这个,其实感觉也不难。
Paint paint = new Paint();
Bitmap bitmap;
private void init(){
paint.setAntiAlias(true);
bitmap = BitmapFactory.decodeResource(getResources() , R.drawable.xxx);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bitmap , 0 , 0 , paint);
}
emmm,第一个任务还是很简单的,今天周五,皮个双休,下周一开始准备下第二个任务