• android自定义View绘制圆形头像与椭圆头像


    android_image1 (2).pngandroid_image1 (1).png

    要实现这两种效果,需要自定义View,并且有两种实现方式.
     
    第一种:
    public class BitmapShaders extends View
    {
        private  BitmapShader bitmapShader = null;
        private Bitmap bitmap = null;
        private Paint paint = null;
        private ShapeDrawable shapeDrawable = null;
        private int BitmapWidth  = 0;
        private int BitmapHeight = 0;
        public BitmapShaders(Context context)
        {
            super(context);
            //得到图像
            bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.h)).getBitmap();  
            BitmapWidth = bitmap.getWidth();
            BitmapHeight = bitmap.getHeight();
            //构造渲染器BitmapShader
            bitmapShader = new BitmapShader(bitmap,Shader.TileMode.MIRROR,Shader.TileMode.REPEAT);
        }
        @Override
        protected void onDraw(Canvas canvas)
        {
            super.onDraw(canvas);
            //将图片裁剪为椭圆形  
            //构建ShapeDrawable对象并定义形状为椭圆  
            shapeDrawable = new ShapeDrawable(new OvalShape());
            //得到画笔并设置渲染
            shapeDrawable.getPaint().setShader(bitmapShader);
            //设置显示区域
            shapeDrawable.setBounds(20, 20,700,BitmapHeight);//可见区域
            //绘制shapeDrawable
            shapeDrawable.draw(canvas);
        }
    } 
     
    第二种:
    public class CircleImageView extends ImageView { 
     
        private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;  
     
        private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
        
        private static final int COLORDRAWABLE_DIMENSION = 1;  //尺寸
     
        private static final int DEFAULT_BORDER_WIDTH = 0;  //边框宽度
        private static final int DEFAULT_BORDER_COLOR = Color.BLACK;  //边框颜色
     
        private final RectF mDrawableRect = new RectF();//图像矩形
        private final RectF mBorderRect = new RectF();  //边框矩形
     
        private final Matrix mShaderMatrix = new Matrix();  //矩阵
        private final Paint mBitmapPaint = new Paint();   //图像画笔
        private final Paint mBorderPaint = new Paint();//边框画笔
     
        private int mBorderColor = DEFAULT_BORDER_COLOR;  //边框颜色
        private int mBorderWidth = DEFAULT_BORDER_WIDTH;  //边框宽度
      
        private Bitmap mBitmap;  //图片
        private BitmapShader mBitmapShader;  //渲染为圆�?
        private int mBitmapWidth;   //位图宽度
        private int mBitmapHeight;  //位图高度
     
        private float mDrawableRadius;   //图片半径
        private float mBorderRadius;  //边框半径
     
        private boolean mReady;  
        private boolean mSetupPending;
     
        public CircleImageView(Context context) {
            super(context);
     
            init();
        }
     
        public CircleImageView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
     
        public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
     
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);
     
            mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_widthDEFAULT_BORDER_WIDTH);
            mBorderColor = a.getColor(R.styleable.CircleImageView_border_colorDEFAULT_BORDER_COLOR);
     
            a.recycle();
     
            init();
        }
     
        private void init() {
            super.setScaleType(SCALE_TYPE);//按比例扩�?/缩小图片的size居中显示,使得图片的高等于View的高,使得图片宽等于或大于View的宽
            mReady = true;
     
            if (mSetupPending) {
                setup();
                mSetupPending = false;
            }
        }
     
        @Override
        public ScaleType getScaleType() {
            return SCALE_TYPE;
        }
     
        @Override
        public void setScaleType(ScaleType scaleType) {
            if (scaleType != SCALE_TYPE) {
                throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
            }
        }
     
        @Override
        protected void onDraw(Canvas canvas) {
            if (getDrawable() == null) {
                return;
            }
            canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadiusmBitmapPaint);
            if (mBorderWidth != 0) {
                canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadiusmBorderPaint);
            }
        }
     
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            setup();
        }
     
        public int getBorderColor() {
            return mBorderColor;
        }
     
        public void setBorderColor(int borderColor) {
            if (borderColor == mBorderColor) {
                return;
            }
     
            mBorderColor = borderColor;
            mBorderPaint.setColor(mBorderColor);
            invalidate();
        }
     
        public int getBorderWidth() {
            return mBorderWidth;
        }
     
        public void setBorderWidth(int borderWidth) {
            if (borderWidth == mBorderWidth) {
                return;
            }
     
            mBorderWidth = borderWidth;
            setup();
        }
     
        @Override
        public void setImageBitmap(Bitmap bm) {
            super.setImageBitmap(bm);
            mBitmap = bm;
            setup();
        }
     
        @Override
        public void setImageDrawable(Drawable drawable) {
            super.setImageDrawable(drawable);
            mBitmap = getBitmapFromDrawable(drawable);
            setup();
        }
     
        @Override
        public void setImageResource(int resId) {
            super.setImageResource(resId);
            mBitmap = getBitmapFromDrawable(getDrawable());
            setup();
        }
        
        @Override
        public void setImageURI(Uri uri) {
            super.setImageURI(uri);
            mBitmap = getBitmapFromDrawable(getDrawable());
            setup();
        }
        
        private Bitmap getBitmapFromDrawable(Drawable drawable) {
            if (drawable == null) {
                return null;
            }
     
            if (drawable instanceof BitmapDrawable) {
                return ((BitmapDrawable) drawable).getBitmap();
            }
     
            try {
                Bitmap bitmap;
     
                if (drawable instanceof ColorDrawable) {
                    bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSIONCOLORDRAWABLE_DIMENSIONBITMAP_CONFIG);
                } else {
                    bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
                }
     
                Canvas canvas = new Canvas(bitmap);
                drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
                drawable.draw(canvas);
                return bitmap;
            } catch (OutOfMemoryError e) {
                return null;
            }
        }
     
        private void setup() {
            Log.e("info","进入setUp");
            if (!mReady) {
                mSetupPending = true;
                return;
            }
     
            if (mBitmap == null) {
                return;
            }
     
            mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
     
            mBitmapPaint.setAntiAlias(true);
            mBitmapPaint.setShader(mBitmapShader);
     
            mBorderPaint.setStyle(Paint.Style.STROKE);
            mBorderPaint.setAntiAlias(true);
            mBorderPaint.setColor(mBorderColor);
            mBorderPaint.setStrokeWidth(mBorderWidth);
     
            mBitmapHeight = mBitmap.getHeight();
            mBitmapWidth = mBitmap.getWidth();
     
            mBorderRect.set(0, 0, getWidth(), getHeight());
            mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);
     
            mDrawableRect.set(mBorderWidthmBorderWidthmBorderRect.width() - mBorderWidthmBorderRect.height() - mBorderWidth);
            mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
            
            updateShaderMatrix();
            invalidate();
        }
     
        private void updateShaderMatrix() {
            float scale;
            float dx = 0;
            float dy = 0;
     
            mShaderMatrix.set(null);
     
            if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
                scale = mDrawableRect.height() / (floatmBitmapHeight;
                dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
            } else {
                scale = mDrawableRect.width() / (floatmBitmapWidth;
                dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
            }
     
            mShaderMatrix.setScale(scale, scale);
            mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);
            
            mBitmapShader.setLocalMatrix(mShaderMatrix);
        }
     
     
     
     
     





    qq3061280@163.com
  • 相关阅读:
    【LOJ#10027】魔板
    【LOJ#2653】山峰和山谷
    【POJ2449】第k短路
    【HAOI2008】移动玩具
    【洛谷P1379】八数码难题
    【NOIP2002】字串变换
    【CH2501】矩阵距离
    【CH2601】电路维修
    【NOIP2009】靶形数独
    树的子结构
  • 原文地址:https://www.cnblogs.com/aibuli/p/820b4e20f2f018ceaefe2078527e4c81.html
Copyright © 2020-2023  润新知