前言
在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;
}
