前言

Android平台绘制一张图片,使用至少3种不同的 API,ImageViewSurfaceView,自定义View

正文

下面分别使用ImageView、SurfaceView和自定义View,其中SurfaceView部分有参考其他网友(具体如下链接)。

ImageView

这个比较简单,现成的。

  1. findViewById(R.id.show_image_iv_one).setBackground(getResources().getDrawable(R.mipmap.one_test_image));
复制

SurfaceView

  1. SurfaceView这个类实现了SurfaceHolder.Callback接口 接口中主要有三个回调函数SurfaceChanged,Surfacecreated,Surfaceondestoryed分别对应Surface更改,创建,销毁。
  2. 对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用getHolder()。来获得SurfaceHolder对象,然后用addCallback()加上回调接口(因为你的类实现了相应的接口,所以此处传入this即可)。
  3. 在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。
  4. 绘制:在线程类的run()方法中进行绘制操作,通过lockCanvas()方法获得Canvas对象,然后就可以用这个对象进行绘制,绘制完成后调用unlockCanvasAndPost(),传入Canvas对象,这时Surface将会按Canvas进行绘制。

注意:每次利用SurfaceHolder获得画布时,前一次的内容将会保留。

  1. class SurfaceViewThread extends Thread {
  2.  
  3. private SurfaceHolder mSurfaceHolder = null;
  4.  
  5. SurfaceViewThread(SurfaceHolder surfaceHolder) {
  6. mSurfaceHolder = surfaceHolder;
  7. }
  8.  
  9. @Override
  10. public void run() {
  11. super.run();
  12. Log.d(TAG, "run surfaceHolder : " + mSurfaceHolder);
  13. if (null != mSurfaceHolder) {
  14. Canvas canvas = mSurfaceHolder.lockCanvas();
  15. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.one_test_image);
  16. canvas.drawBitmap(bitmap, 0, 0, null);
  17. mSurfaceHolder.unlockCanvasAndPost(canvas);
  18. }
  19. }
  20. }
  21.  
  22. SurfaceView surfaceView = findViewById(R.id.show_image_sv_two);
  23.  
  24. SurfaceViewThread surfaceViewThread = new SurfaceViewThread(surfaceView.getHolder());
  25.  
  26. surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
  27. @Override
  28. public void surfaceCreated(SurfaceHolder holder) {
  29. Log.d(TAG, "surfaceCreated: ");
  30. surfaceViewThread.start();
  31. }
  32.  
  33. @Override
  34. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  35. Log.d(TAG, "surfaceChanged: ");
  36. }
  37.  
  38. @Override
  39. public void surfaceDestroyed(SurfaceHolder holder) {
  40. Log.d(TAG, "surfaceDestroyed: ");
  41. try {
  42. surfaceViewThread.join();
  43. } catch (InterruptedException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. });
  48.  
复制

自定义View

  1. public class MyImageView extends View {
  2.  
  3. private Bitmap mBitmap = null;
  4.  
  5. public MyImageView(Context context) {
  6. this(context, null);
  7. }
  8.  
  9. public MyImageView(Context context, @Nullable AttributeSet attrs) {
  10. this(context, attrs, 0);
  11. }
  12.  
  13. public MyImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  14. super(context, attrs, defStyleAttr);
  15. initUI();
  16. }
  17.  
  18. /**
  19. * init ui
  20. */
  21. private void initUI() {
  22. mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.one_test_image);
  23. return;
  24. }
  25.  
  26. @Override
  27. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  28. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  29. }
  30.  
  31. @Override
  32. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
  33. super.onLayout(changed, left, top, right, bottom);
  34. }
  35.  
  36. @Override
  37. protected void onDraw(Canvas canvas) {
  38. super.onDraw(canvas);
  39.  
  40. canvas.drawBitmap(mBitmap, 0, 0, null);
  41. }
  42.  
  43. /**
  44. * release
  45. */
  46. public void release() {
  47. if (null != mBitmap && !mBitmap.isRecycled()) {
  48. mBitmap.isRecycled();
  49. }
  50. return;
  51. }
复制

参考文章

  1. Android 音视频开发入门指南
  2. 音视频学习1-使用ImageView,SurfaceView,自定义 View,绘制图片

相关文章

暂无评论

none
暂无评论...