小言_互联网的博客

Android 自定义View Canvas —— Bitmap

344人阅读  评论(0)

Bitmap 绘制图片 常用的方法有一下几种

(1) drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint)

(2) drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint)

(3) drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst, @Nullable Paint paint)

 

1 drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint)

 1.1 使用BitmapFactory解析图片


  
  1. paint.setAntiAlias( true);
  2. // 设置画笔的style (Paint.Style.FILL填充,Paint.Style.STROKE描边,Paint.Style.FILL_AND_STROKE填充加描边 )
  3. paint.setStyle(Paint.Style.FILL);
  4. // 设置画笔的颜色 这里只是绘制图片感觉用不到就注释掉了
  5. // paint.setColor(Color.RED);
  6. // paint.setStrokeWidth(10f);
  7. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.girl);
  8. canvas.drawBitmap(bitmap, 100, 100, paint);

或者


  
  1. paint.setAntiAlias( true);
  2. // 设置画笔的style (Paint.Style.FILL填充,Paint.Style.STROKE描边,Paint.Style.FILL_AND_STROKE填充加描边 )
  3. paint.setStyle(Paint.Style.FILL);
  4. // 设置画笔的颜色 这里只是绘制图片感觉用不到就注释掉了
  5. // paint.setColor(Color.RED);
  6. // paint.setStrokeWidth(10f);
  7. // Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.girl);
  8. @SuppressLint("ResourceType")
  9. Bitmap bitmap =BitmapFactory.decodeStream(getResources().openRawResource(R.mipmap.girl));
  10. canvas.drawBitmap(bitmap, 100, 100, paint);

效果图

1.2  使用BitmapDrawable解析图片


  
  1. paint.setAntiAlias( true);
  2. // 设置画笔的style (Paint.Style.FILL填充,Paint.Style.STROKE描边,Paint.Style.FILL_AND_STROKE填充加描边 )
  3. paint.setStyle(Paint.Style.FILL);
  4. // 设置画笔的颜色 这里只是绘制图片感觉用不到就注释掉了
  5. // paint.setColor(Color.RED);
  6. // paint.setStrokeWidth(10f);
  7. // BitmapDrawable
  8. BitmapDrawable bitmapDrawable = (BitmapDrawable) getResources().getDrawable(R.mipmap.girl);
  9. // 得到Bitmap
  10. Bitmap bitmap = bitmapDrawable.getBitmap();
  11. canvas.drawBitmap(bitmap, 100, 100, paint);

效果图如下:

1.3 使用InputStream和BitmapDrawable绘制


  
  1. paint.setAntiAlias( true);
  2. // 设置画笔的style (Paint.Style.FILL填充,Paint.Style.STROKE描边,Paint.Style.FILL_AND_STROKE填充加描边 )
  3. paint.setStyle(Paint.Style.FILL);
  4. // 设置画笔的颜色 这里只是绘制图片感觉用不到就注释掉了
  5. // paint.setColor(Color.RED);
  6. // paint.setStrokeWidth(10f);
  7. // InputStream得到资源流
  8. @SuppressLint("ResourceType")
  9. InputStream in = getResources().openRawResource(R.mipmap.girl);
  10. // BitmapDrawable 解析数据流
  11. BitmapDrawable bitmapDrawable = new BitmapDrawable( in);
  12. // 得到图片
  13. Bitmap bitmap = bitmapDrawable.getBitmap();
  14. // 得到Bitmap
  15. canvas.drawBitmap(bitmap, 100, 100, paint);

效果图如下:

2 drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint)

Matrix 是变形矩阵 这里先简单的说下其一般的使用方法, new 一下然后使用其方法即可,后面在开一篇Matrix的文章

下面是图片放大的方法如下:


  
  1. paint.setAntiAlias( true);
  2. // 设置画笔的style (Paint.Style.FILL填充,Paint.Style.STROKE描边,Paint.Style.FILL_AND_STROKE填充加描边 )
  3. paint.setStyle(Paint.Style.FILL);
  4. // 设置画笔的颜色 这里只是绘制图片感觉用不到就注释掉了
  5. // paint.setColor(Color.RED);
  6. // paint.setStrokeWidth(10f);
  7. // decodeResource
  8. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.girl);
  9. // 得到Bitmap
  10. Matrix matrix = new Matrix();
  11. matrix.setScale( 1.2f, 1.2f);
  12. canvas.drawBitmap(bitmap, matrix, paint);

效果图如下:

3 drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst, @Nullable Paint paint)

注意:src 本次绘制的原区域 dst 本次绘制的目标区域


  
  1. paint.setAntiAlias( true);
  2. // 设置画笔的style (Paint.Style.FILL填充,Paint.Style.STROKE描边,Paint.Style.FILL_AND_STROKE填充加描边 )
  3. paint.setStyle(Paint.Style.FILL);
  4. // 设置画笔的颜色 这里只是绘制图片感觉用不到就注释掉了
  5. paint.setColor(Color.RED);
  6. paint.setStrokeWidth( 10f);
  7. // decodeResource
  8. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.girl);
  9. //src 本次绘制的原区域 dst 本次绘制的目标区域
  10. Rect src = new Rect( 0, 0, bitmap.getWidth(), bitmap.getHeight());
  11. canvas.drawRect(src, paint);
  12. Rect dst = new Rect( 0, 0, 500, 300);
  13. canvas.drawBitmap(bitmap, src, dst, paint);

效果图如下:

上面的方法我们估计在项目中没怎么使用过,在自定义view 中我们为了方便统一的管理一般都是结合xml

来一起加载bitmap 下面也加载一个图片看看


  
  1. public class TestView extends View {
  2. // paint 初始化
  3. private Paint paint = new Paint();
  4. private Bitmap testBitmap;
  5. private int testBitmapResID;
  6. public TestView(Context context) {
  7. super(context);
  8. }
  9. public TestView(Context context, @Nullable AttributeSet attrs) {
  10. super(context, attrs);
  11. init(context, attrs);
  12. }
  13. public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  14. super(context, attrs, defStyleAttr);
  15. init(context, attrs);
  16. }
  17. private void init(Context context, AttributeSet attrs) {
  18. paint.setAntiAlias( true);
  19. // 设置画笔的style (Paint.Style.FILL填充,Paint.Style.STROKE描边,Paint.Style.FILL_AND_STROKE填充加描边 )
  20. paint.setStyle(Paint.Style.FILL);
  21. // 设置画笔的颜色 这里只是绘制图片感觉用不到就注释掉了
  22. paint.setColor(Color.RED);
  23. paint.setStrokeWidth( 10f);
  24. TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.FindImage);
  25. testBitmapResID = typedArray.getResourceId(R.styleable.FindImage_test_image, R.mipmap.girl);
  26. typedArray.recycle();
  27. }
  28. @Override
  29. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  30. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  31. }
  32. @Override
  33. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
  34. super.onLayout(changed, left, top, right, bottom);
  35. }
  36. @Override
  37. protected void onDraw(Canvas canvas) {
  38. super.onDraw(canvas);
  39. testBitmap = BitmapFactory.decodeResource(getResources(), testBitmapResID);
  40. canvas.drawBitmap(testBitmap, 100, 100, paint);
  41. }
  42. }

attr.xml 的代码如下:


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="FindImage">
  4. <attr name="test_image" format="reference" />
  5. </declare-styleable>
  6. </resources>

效果图如下:

上面的这个绘制图片的大家有没有发现,我没有放布局的xml 使用的默认的图片,当然我们也可以不使用默认的的图片

就是这个地方的

 下面修改下默认的图片为android icon 然后在看下效果

自定义view:


  
  1. public class TestView extends View {
  2. // paint 初始化
  3. private Paint paint = new Paint();
  4. private Bitmap testBitmap;
  5. private int testBitmapResID;
  6. public TestView(Context context) {
  7. super(context);
  8. }
  9. public TestView(Context context, @Nullable AttributeSet attrs) {
  10. super(context, attrs);
  11. init(context, attrs);
  12. }
  13. public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  14. super(context, attrs, defStyleAttr);
  15. init(context, attrs);
  16. }
  17. private void init(Context context, AttributeSet attrs) {
  18. TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.FindView);
  19. testBitmap = BitmapFactory.decodeResource(getResources(), testBitmapResID);
  20. testBitmapResID = typedArray.getResourceId(R.styleable.FindView_test_image,R.drawable.ic_launcher_background);
  21. typedArray.recycle();
  22. }
  23. @Override
  24. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  25. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  26. }
  27. @Override
  28. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
  29. super.onLayout(changed, left, top, right, bottom);
  30. }
  31. @Override
  32. protected void onDraw(Canvas canvas) {
  33. super.onDraw(canvas);
  34. paint.setStyle(Paint.Style.FILL);
  35. testBitmap = BitmapFactory.decodeResource(getResources(), testBitmapResID);
  36. canvas.drawBitmap(testBitmap, 100, 100, paint);
  37. }

att.xml


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="FindImage">
  4. <attr name="test_image" format="reference" />
  5. </declare-styleable>
  6. </resources>

在布局中引用图片:


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app= "http://schemas.android.com/apk/res-auto"
  4. xmlns:tools= "http://schemas.android.com/tools"
  5. android:layout_width= "match_parent"
  6. android:layout_height= "match_parent"
  7. tools:context= ".MainActivity">
  8. <com.hly.view.TestView
  9. android:id= "@+id/image"
  10. android:layout_width= "wrap_content"
  11. android:layout_height= "wrap_content"
  12. app:test_image= "@mipmap/girl" />
  13. </LinearLayout>

这里注意test_image 是attr里面的name

效果图如下:


转载:https://blog.csdn.net/qq_33210042/article/details/108602911
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场