请选择 进入手机版 | 继续访问电脑版

牛大大的个人博客

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2500|回复: 1

imageview 圆角,边框 问题解决方法

[复制链接]

149

主题

201

帖子

643

积分

版主

Rank: 7Rank: 7Rank: 7

积分
643
发表于 2020-6-13 22:24:17 | 显示全部楼层 |阅读模式

activity_main.xml
  1. <FrameLayout
  2.         android:id="@+id/ui_fl_0"
  3.         android:layout_width="@dimen/flsquare_width"
  4.         android:layout_height="@dimen/flsquare_width"
  5.         android:layout_marginLeft="30dp"
  6.         android:layout_marginTop="80dp" >

  7.         <com.z091nbu.ivbg
  8.             android:id="@+id/ui_iv_bg_0"
  9.             android:layout_width="@dimen/flbgsquare_width"
  10.             android:layout_height="@dimen/flbgsquare_width"
  11.             android:scaleType="fitXY"
  12.             android:src="@drawable/iv_0"
  13.             android:visibility="gone" />

  14.         <com.z091nbu.iv0
  15.             android:id="@+id/ui_iv_0_0"
  16.             android:layout_width="@dimen/flvi0square_width"
  17.             android:layout_height="@dimen/flvi0square_width"
  18.             android:layout_marginLeft="@dimen/vi0left"
  19.             android:layout_marginTop="@dimen/vi0left"            
  20.             android:scaleType="fitXY"
  21.             android:src="@drawable/iv_0"  />

  22.         <com.z091nbu.iv0
  23.             android:id="@+id/ui_iv_1_0"
  24.             android:layout_width="@dimen/flvi1square_width"
  25.             android:layout_height="@dimen/flvi1square_width"
  26.             android:layout_marginLeft="@dimen/vi1left"
  27.             android:layout_marginTop="@dimen/vi1left"
  28.             android:clickable="true"
  29.             android:focusable="true"
  30.             android:scaleType="fitXY" />

  31.     </FrameLayout>
复制代码
COM.Z091NBU.IV0.JAVA   圆角
  1. package com.z091nbu;

  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.Bitmap.Config;
  5. import android.graphics.BitmapShader;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Matrix;
  9. import android.graphics.Paint;
  10. import android.graphics.RectF;
  11. import android.graphics.Shader.TileMode;
  12. import android.graphics.drawable.BitmapDrawable;
  13. import android.graphics.drawable.Drawable;
  14. import android.util.AttributeSet;
  15. import android.util.TypedValue;
  16. import android.widget.ImageView;

  17. public class iv0 extends ImageView {

  18.     private Paint mPaint;

  19.     private RectF mRect;//矩形凹行大小

  20.     private int mRoundRadius;// 圆角大小
  21.    
  22.     private BitmapShader mBitmapShader;//图形渲染

  23.     private Matrix mMatrix;

  24.     private int mType;// 记录是圆形还是圆角矩形

  25.     public static final int TYPE_ROUND = 1;// 圆角矩形
  26.     public static final int DEFAUT_ROUND_RADIUS = 20;//默认圆角大小

  27.     public iv0(Context context) {
  28.         this(context, null);
  29.         // TODO Auto-generated constructor stub
  30.     }

  31.     public iv0(Context context, AttributeSet attrs) {
  32.         this(context, attrs, 0);
  33.         // TODO Auto-generated constructor stub
  34.     }

  35.     public iv0(Context context, AttributeSet attrs, int defStyle) {
  36.         super(context, attrs, defStyle);
  37.         initView();
  38.     }

  39.     private void initView() {
  40.         mPaint = new Paint();
  41.         mPaint.setAntiAlias(true);
  42.         mMatrix = new Matrix();
  43.         mRoundRadius = DEFAUT_ROUND_RADIUS;
  44.     }

  45.     @Override
  46.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  47.         // TODO Auto-generated method stub
  48.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  49.         // 如果是绘制圆形,则强制宽高大小一致
  50.     }

  51.     @Override
  52.     protected void onDraw(Canvas canvas) {

  53.         if (null == getDrawable()) {
  54.             return;
  55.         }
  56.         setBitmapShader();
  57.             mPaint.setColor(Color.RED);
  58.             canvas.drawRoundRect(mRect, mRoundRadius, mRoundRadius, mPaint);         
  59.      }

  60.     @Override
  61.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  62.         // TODO Auto-generated method stub
  63.         super.onSizeChanged(w, h, oldw, oldh);
  64.         mRect = new RectF(0, 0, getWidth(), getHeight());
  65.     }

  66.     /**
  67.      * 设置BitmapShader
  68.      */
  69.     private void setBitmapShader() {
  70.         Drawable drawable = getDrawable();
  71.         if (null == drawable) {
  72.             return;
  73.         }
  74.         Bitmap bitmap = drawableToBitmap(drawable);
  75.         // 将bitmap作为着色器来创建一个BitmapShader
  76.         mBitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
  77.         float scale = 1.0f;         
  78.             // 如果图片的宽或者高与view的宽高不匹配,计算出需要缩放的比例;缩放后的图片的宽高,一定要大于我们view的宽高;所以我们这里取大值;
  79.         scale = Math.max(getWidth() * 1.0f / bitmap.getWidth(), getHeight() * 1.0f / bitmap.getHeight());
  80.         
  81.         // shader的变换矩阵,我们这里主要用于放大或者缩小
  82.         mMatrix.setScale(scale, scale);
  83.         // 设置变换矩阵
  84.         mBitmapShader.setLocalMatrix(mMatrix);
  85.         mPaint.setShader(mBitmapShader);

  86.     }

  87.     /**
  88.      * drawable转bitmap
  89.      *
  90.      * @param drawable
  91.      * @return
  92.      */
  93.     private Bitmap drawableToBitmap(Drawable drawable) {
  94.         if (drawable instanceof BitmapDrawable) {
  95.             BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
  96.             return bitmapDrawable.getBitmap();
  97.         }
  98.         int w = drawable.getIntrinsicWidth();
  99.         int h = drawable.getIntrinsicHeight();
  100.         Bitmap bitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);
  101.         Canvas canvas = new Canvas(bitmap);
  102.         drawable.setBounds(0, 0, w, h);
  103.         drawable.draw(canvas);
  104.         return bitmap;
  105.     }
  106.     /**
  107.      * 单位dp转单位px
  108.      */
  109.     public int dpTodx(int dp){
  110.         
  111.         return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,  
  112.                 dp, getResources().getDisplayMetrics());  
  113.     }
  114.    
  115.     public int getType() {
  116.         return mType;
  117.     }
  118.     /**
  119.      * 设置图片类型:圆形、圆角矩形、椭圆形
  120.      * @param mType
  121.      */
  122.     public void setType(int mType) {
  123.         if(this.mType != mType){
  124.             this.mType = mType;
  125.             invalidate();
  126.         }
  127.         
  128.     }
  129.     public int getRoundRadius() {
  130.         return mRoundRadius;
  131.     }
  132.     /**
  133.      * 设置圆角大小
  134.      * @param mRoundRadius
  135.      */
  136.     public void setRoundRadius(int mRoundRadius) {
  137.         if(this.mRoundRadius != mRoundRadius){
  138.             this.mRoundRadius = mRoundRadius;
  139.             invalidate();
  140.         }
  141.         
  142.     }
  143. }
复制代码




回复

使用道具 举报

149

主题

201

帖子

643

积分

版主

Rank: 7Rank: 7Rank: 7

积分
643
 楼主| 发表于 2020-6-13 22:26:02 | 显示全部楼层
ivbg.java  边框

  1. package com.z091nbu;

  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.Bitmap.Config;
  5. import android.graphics.BitmapShader;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Matrix;
  9. import android.graphics.Paint;
  10. import android.graphics.RectF;
  11. import android.graphics.Shader.TileMode;
  12. import android.graphics.drawable.BitmapDrawable;
  13. import android.graphics.drawable.Drawable;
  14. import android.util.AttributeSet;
  15. import android.util.TypedValue;
  16. import android.widget.ImageView;

  17. public class ivbg extends ImageView {

  18.     private Paint mPaint;

  19.     private RectF mRect;//矩形凹行大小

  20.     private int mRoundRadius;// 圆角大小
  21.    
  22.     private BitmapShader mBitmapShader;//图形渲染

  23.     private Matrix mMatrix;

  24.     private int mType;// 记录是圆形还是圆角矩形

  25.     public static final int TYPE_ROUND = 1;// 圆角矩形
  26.     public static final int DEFAUT_ROUND_RADIUS = 20;//默认圆角大小

  27.        
  28.     private int borderColor = Color.WHITE;  ///**边框颜色*/        
  29.         private int borderWidth = 5;   ///**边框宽度*/


  30.     public ivbg(Context context) {
  31.         this(context, null);
  32.         // TODO Auto-generated constructor stub
  33.     }

  34.     public ivbg(Context context, AttributeSet attrs) {
  35.         this(context, attrs, 0);
  36.         // TODO Auto-generated constructor stub
  37.     }

  38.     public ivbg(Context context, AttributeSet attrs, int defStyle) {
  39.         super(context, attrs, defStyle);
  40.         initView();
  41.     }

  42.     private void initView() {
  43.         mPaint = new Paint();  //初始化画笔
  44.         mPaint.setAntiAlias(true); //抗锯齿
  45.         mMatrix = new Matrix();
  46.         mRoundRadius = DEFAUT_ROUND_RADIUS;
  47.     }

  48.     @Override
  49.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  50.         // TODO Auto-generated method stub
  51.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  52.         // 如果是绘制圆形,则强制宽高大小一致
  53.     }

  54.     @Override
  55.     protected void onDraw(Canvas canvas) {

  56.         if (null == getDrawable()) {
  57.             return;
  58.         }
  59.         setBitmapShader();
  60.         mPaint.setColor(Color.RED);  //初始化颜色
  61.       
  62.               Paint borderPaint = getBorderPaint(borderColor, borderWidth); //创建边框画笔
  63.         canvas.drawRoundRect(mRect, mRoundRadius, mRoundRadius, mPaint);
  64.         canvas.drawRoundRect(mRect, mRoundRadius, mRoundRadius, borderPaint);
  65.       //canvas.drawRoundRect(borderRectF, roundRadius, roundRadius, borderPaint);
  66.       //canvas.drawRoundRect(mRect, mRoundRadius, mRoundRadius, mPaint);  
  67.      }

  68.     private Paint getBorderPaint(int borderColor, int borderWidth){
  69.                 //画笔
  70.                 Paint borderPaint = new Paint();
  71.                 //颜色
  72.                 borderPaint.setColor(borderColor);
  73.                 //style属性
  74.                 borderPaint.setStyle(Paint.Style.STROKE);
  75.                 //画笔的宽度
  76.                 borderPaint.setStrokeWidth(borderWidth);
  77.                 return borderPaint;
  78.         }

  79.    
  80.    
  81.    
  82.     @Override
  83.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  84.         // TODO Auto-generated method stub
  85.         super.onSizeChanged(w, h, oldw, oldh);
  86.         mRect = new RectF(0, 0, getWidth(), getHeight());
  87.     }

  88.     /**
  89.      * 设置BitmapShader
  90.      */
  91.     private void setBitmapShader() {
  92.         Drawable drawable = getDrawable();
  93.         if (null == drawable) {
  94.             return;
  95.         }
  96.         Bitmap bitmap = drawableToBitmap(drawable);
  97.         // 将bitmap作为着色器来创建一个BitmapShader
  98.         mBitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
  99.         float scale = 1.0f;         
  100.         // 如果图片的宽或者高与view的宽高不匹配,计算出需要缩放的比例;缩放后的图片的宽高,一定要大于我们view的宽高;所以我们这里取大值;
  101.         scale = Math.max(getWidth() * 1.0f / bitmap.getWidth(), getHeight() * 1.0f / bitmap.getHeight());
  102.         
  103.         // shader的变换矩阵,我们这里主要用于放大或者缩小
  104.         mMatrix.setScale(scale, scale);
  105.         // 设置变换矩阵
  106.         mBitmapShader.setLocalMatrix(mMatrix);
  107.         mPaint.setShader(mBitmapShader);

  108.     }

  109.     /**
  110.      * drawable转bitmap
  111.      *
  112.      * @param drawable
  113.      * @return
  114.      */
  115.     private Bitmap drawableToBitmap(Drawable drawable) {
  116.         if (drawable instanceof BitmapDrawable) {
  117.             BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
  118.             return bitmapDrawable.getBitmap();
  119.         }
  120.         int w = drawable.getIntrinsicWidth();
  121.         int h = drawable.getIntrinsicHeight();
  122.         Bitmap bitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);
  123.         Canvas canvas = new Canvas(bitmap);
  124.         drawable.setBounds(0, 0, w, h);
  125.         drawable.draw(canvas);
  126.         return bitmap;
  127.     }
  128.     /**
  129.      * 单位dp转单位px
  130.      */
  131.     public int dpTodx(int dp){
  132.         
  133.         return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,  
  134.                 dp, getResources().getDisplayMetrics());  
  135.     }
  136.    
  137.     public int getType() {
  138.         return mType;
  139.     }
  140.     /**
  141.      * 设置图片类型:圆形、圆角矩形、椭圆形
  142.      * @param mType
  143.      */
  144.     public void setType(int mType) {
  145.         if(this.mType != mType){
  146.             this.mType = mType;
  147.             invalidate();
  148.         }
  149.         
  150.     }
  151.     public int getRoundRadius() {
  152.         return mRoundRadius;
  153.     }
  154.     /**
  155.      * 设置圆角大小
  156.      * @param mRoundRadius
  157.      */
  158.     public void setRoundRadius(int mRoundRadius) {
  159.         if(this.mRoundRadius != mRoundRadius){
  160.             this.mRoundRadius = mRoundRadius;
  161.             invalidate();
  162.         }
  163.         
  164.     }
  165. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|牛大大的个人博客 ( 苏ICP备17043571号-2 )

GMT+8, 2021-6-15 12:26 , Processed in 0.196602 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表