目标一:在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View
- ImageView绘制图片,因为ImageView是Android的控件,所以不管是在xml中还是用java代码都是比较好实现的,用setImageResource、setImageBitmap、setImageDrawable、setBackGround等都可以显示一张图片,而ImageView内部是利用Canvas画了一个Bitmap。
- SurfaceView绘制图片,首先需要实现SurfaceHolder.Callback并注册,然后就是在surfaceCreated或者surfaceChanged里面画图片
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
new Thread() {
@Override
public void run() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.dog);
SurfaceHolder surfaceHolder = mSurfaceView.getHolder();
Canvas canvas = surfaceHolder.lockCanvas();
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
canvas.drawBitmap(bitmap, new Matrix(), paint);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}.start();
}
3.自定义View显示图片,其实也是利用画布去画一个Bitmap,方法也有几个看需要选择
/**
* 显示图片的自定义View
*/
public class ShowPictureView extends View {
private Bitmap mBitmap;
private Paint mPicPaint;
public ShowPictureView(Context context) {
this(context, null);
}
public ShowPictureView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ShowPictureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.dog);
mPicPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
}
/**
* 设置Bitmap
*/
public void setBitmap(Bitmap bitmap) {
mBitmap = bitmap;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mBitmap != null) {
canvas.drawBitmap(mBitmap, 30, 10, mPicPaint);
}
}
}
至此,三种方式画图片就完成了,由于难度较小,所以只是简单实现了一下,现实中可能考虑更多的情况。
源码已上传Github