前言
在Android平台绘制一张图片,使用至少3种不同的 API,ImageView,SurfaceView,自定义View
正文
下面分别使用ImageView、SurfaceView和自定义View,其中SurfaceView部分有参考其他网友(具体如下链接)。
ImageView
这个比较简单,现成的。
findViewById(R.id.show_image_iv_one).setBackground(getResources().getDrawable(R.mipmap.one_test_image));
SurfaceView
- SurfaceView这个类实现了SurfaceHolder.Callback接口 接口中主要有三个回调函数SurfaceChanged,Surfacecreated,Surfaceondestoryed分别对应Surface更改,创建,销毁。
- 对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用getHolder()。来获得SurfaceHolder对象,然后用addCallback()加上回调接口(因为你的类实现了相应的接口,所以此处传入this即可)。
- 在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。
- 绘制:在线程类的run()方法中进行绘制操作,通过lockCanvas()方法获得Canvas对象,然后就可以用这个对象进行绘制,绘制完成后调用unlockCanvasAndPost(),传入Canvas对象,这时Surface将会按Canvas进行绘制。
注意:每次利用SurfaceHolder获得画布时,前一次的内容将会保留。
class SurfaceViewThread extends Thread { private SurfaceHolder mSurfaceHolder = null; SurfaceViewThread(SurfaceHolder surfaceHolder) { mSurfaceHolder = surfaceHolder; } @Override public void run() { super.run(); Log.d(TAG, "run surfaceHolder : " + mSurfaceHolder); if (null != mSurfaceHolder) { Canvas canvas = mSurfaceHolder.lockCanvas(); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.one_test_image); canvas.drawBitmap(bitmap, 0, 0, null); mSurfaceHolder.unlockCanvasAndPost(canvas); } } } SurfaceView surfaceView = findViewById(R.id.show_image_sv_two); SurfaceViewThread surfaceViewThread = new SurfaceViewThread(surfaceView.getHolder()); surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "surfaceCreated: "); surfaceViewThread.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d(TAG, "surfaceChanged: "); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG, "surfaceDestroyed: "); try { surfaceViewThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } });
自定义View
public class MyImageView extends View { private Bitmap mBitmap = null; public MyImageView(Context context) { this(context, null); } public MyImageView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public MyImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initUI(); } /** * init ui */ private void initUI() { mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.one_test_image); return; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(mBitmap, 0, 0, null); } /** * release */ public void release() { if (null != mBitmap && !mBitmap.isRecycled()) { mBitmap.isRecycled(); } return; }
参考文章
历史上的今天
暂无评论...
随机推荐
穆旦:古墙
一团灰沙卷起一阵秋风,奔旋地泻下了剥落的古墙,一道晚霞斜挂在西天上,古墙的高处映满了残红。 古墙寂静地弓着残老的腰,驼着悠久的岁月望着前面。一只手臂蜿蜒到百里远,败落地守着暮年的寂寥。 凸凹的砖骨镌着一脸严肃,默默地俯视着广阔的平原;古代的楼阁吞满了荒凉,...
kernel logo到动画间闪黑屏
推荐使用 读书导航 极客导航 :125啦极客导航(http://www.biumall.com/jike.html)最近在Android 6.0时出现logo过度到Android动画时出现闪一下和黑屏问题。查询资料后,在《kernel logo到开机动画之间闪现黑屏(android 5.X)》找...
陈先发:前世
要逃,就干脆逃到蝴蝶的体内去不必再咬着牙,打翻父母的阴谋和药汁不必等到血都吐尽了。要为敌,就干脆与整个人类为敌。他哗地一下脱掉了蘸墨的青袍脱掉了一层皮脱掉了内心朝飞暮倦的长亭短亭。脱掉了云和水这情节确实令人震悚:他如此轻易地又脱掉了自己的骨头!我无限眷恋的最后一幕是:他们纵身一跃...
狄兰·托马斯:不要温和地走进那个良夜
不要温和地走进那个良夜,老年应当在日暮时燃烧咆哮;怒斥,怒斥光明的消逝。虽然智慧的人临终时懂得黑暗有理,因为他们的话没有迸发出闪电,他们也并不温和地走进那个良夜。善良的人,当最后一浪过去,高呼他们脆弱的善行可能曾会多么光辉地在绿色的海湾里舞蹈,怒斥,怒斥光明的消逝。狂暴的人抓住并歌唱过...
adb shell 发送广播带包名
前言之前我们知道adb发送广播带参数,但是有于Android的权限慢慢收紧,如果不加上接收应用的包名,无法收到发送的静态广播。Android 8.0Beginning with Android 8.0 (API level 26), the system imposes additiona...
ToolBar的简单使用
前言上一篇《ActionBar中Menu使用》介绍的是主题样式中默认显示ActionBar,这种有局限性不好自定义。因此我们主题样式中隐藏NoActionBar,使用ToolBar来定制更多的选项。正文# 带ActionBarTheme.MaterialComponents.Light...