圆形图片

Posted glj521

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了圆形图片相关的知识,希望对你有一定的参考价值。

自定义imageview

package com.bwei.view;


import com.bwei.main.R;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;

/**
 * Created by Administrator on 2015/4/30.
 */
public class MLImageView extends ImageView {
    private Paint mPressPaint;

    private int mWidth;
    private int mHeight;

    private int mPressAlpha;
    private int mPressColor;
    private int mRadius;
    private int mShapeType;
    private int mBorderWidth;
    private int mBorderColor;

    public MLImageView(Context context) {
        super(context);
        init(context, null);
    }

    public MLImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public MLImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }


    private void init(Context context, AttributeSet attrs) {
        //鍒濆鍖栭粯璁ゅ?
        mPressAlpha = 64;
        mPressColor = getResources().getColor(R.color.ml_gray);
        mRadius = 16;
        mShapeType = 1;
        mBorderWidth = 0;
        mBorderColor = getResources().getColor(R.color.ml_red);

        // 鑾峰彇鎺т欢鐨勫睘鎬у?
        if (attrs != null) {
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MLImageView);
            mPressColor = array.getColor(R.styleable.MLImageView_press_color, mPressColor);
            mPressAlpha = array.getInteger(R.styleable.MLImageView_press_alpha, mPressAlpha);
            mRadius = array.getDimensionPixelSize(R.styleable.MLImageView_radius, mRadius);
            mShapeType = array.getInteger(R.styleable.MLImageView_shape_type, mShapeType);
            mBorderWidth = array.getDimensionPixelOffset(R.styleable.MLImageView_border_width, mBorderWidth);
            mBorderColor = array.getColor(R.styleable.MLImageView_border_color, mBorderColor);
            array.recycle();
        }

        // 鎸変笅鐨勭敾绗旇缃?        
        mPressPaint = new Paint();
        mPressPaint.setAntiAlias(true);
        mPressPaint.setStyle(Paint.Style.FILL);
        mPressPaint.setColor(mPressColor);
        mPressPaint.setAlpha(0);
        mPressPaint.setFlags(Paint.ANTI_ALIAS_FLAG);

        setClickable(true);
        setDrawingCacheEnabled(true);
        setWillNotDraw(false);
    }

    @Override
    protected void onDraw(Canvas canvas) {
//        super.onDraw(canvas);
        // 鑾峰彇褰撳墠鎺т欢鐨?drawable
        Drawable drawable = getDrawable();
        if (drawable == null) {
            return;
        }
        // 杩欓噷 get 鍥炴潵鐨勫搴﹀拰楂樺害鏄綋鍓嶆帶浠剁浉瀵瑰簲鐨勫搴﹀拰楂樺害锛堝湪 xml 璁剧疆锛?       
        if (getWidth() == 0 || getHeight() == 0) {
            return;
        }
        // 鑾峰彇 bitmap锛屽嵆浼犲叆 imageview 鐨?bitmap
        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
        drawDrawable(canvas, bitmap);
        drawPress(canvas);
        drawBorder(canvas);

    }

    private void drawDrawable(Canvas canvas, Bitmap bitmap) {
        // 鐢荤瑪
        Paint paint = new Paint();
        // 棰滆壊璁剧疆
        paint.setColor(0xffffffff);
        // 鎶楅敮榻?        
        paint.setAntiAlias(true);
        //Paint 鐨?Xfermode锛孭orterDuff.Mode.SRC_IN 鍙栦袱灞傚浘鍍忕殑浜ら泦閮ㄩ棬, 鍙樉绀轰笂灞傚浘鍍忋?
        PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
        // 鏍囧織
        int saveFlags = Canvas.MATRIX_SAVE_FLAG
                | Canvas.CLIP_SAVE_FLAG
                | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
                | Canvas.FULL_COLOR_LAYER_SAVE_FLAG
                | Canvas.CLIP_TO_LAYER_SAVE_FLAG;
        canvas.saveLayer(0, 0, mWidth, mHeight, null, saveFlags);

        if (mShapeType == 0) {
            // 鐢婚伄缃╋紝鐢诲嚭鏉ュ氨鏄竴涓拰绌洪棿澶у皬鐩稿尮閰嶇殑鍦?           
            canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, paint);
        } else {
            // 褰揝hapeType = 1 鏃?鍥剧墖涓哄渾瑙掔煩褰?           
            RectF rectf = new RectF(0, 0, getWidth(), getHeight());
            canvas.drawRoundRect(rectf, mRadius, mRadius, paint);
        }

        paint.setXfermode(xfermode);

        // 绌洪棿鐨勫ぇ灏?/ bitmap 鐨勫ぇ灏?= bitmap 缂╂斁鐨勫?鏁?      
        float scaleWidth = ((float) getWidth()) / bitmap.getWidth();
        float scaleHeight = ((float) getHeight()) / bitmap.getHeight();

        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);

        //bitmap 缂╂斁
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

        //draw 涓婂幓
        canvas.drawBitmap(bitmap, 0, 0, paint);
        canvas.restore();
    }

    private void drawPress(Canvas canvas) {

        if(mShapeType == 0){
            canvas.drawCircle(mWidth/2, mHeight/2, mWidth/2, mPressPaint);
        }else if (mShapeType == 1) {
            RectF rectF = new RectF(0, 0, mWidth, mHeight);
            canvas.drawRoundRect(rectF, mRadius, mRadius, mPressPaint);
        }
    }
    private void drawBorder(Canvas canvas){
        if(mBorderWidth > 0){
            Paint paint = new Paint();
            paint.setStrokeWidth(mBorderWidth);
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(mBorderColor);
            paint.setAntiAlias(true);
            if (mShapeType == 0) {
                canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, paint);
            } else {
                // 褰揝hapeType = 1 鏃?鍥剧墖涓哄渾瑙掔煩褰?                
                RectF rectf = new RectF(0, 0, getWidth(), getHeight());
                canvas.drawRoundRect(rectf, mRadius, mRadius, paint);
            }
        }
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        mHeight = h;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPressPaint.setAlpha(mPressAlpha);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                mPressPaint.setAlpha(0);
                invalidate();
                break;
            default:
                invalidate();
                break;
        }
        return super.onTouchEvent(event);
    }

}

values中创建attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--自定义MLImageView的属性-->
    <declare-styleable name="MLImageView">
        <attr name="press_alpha" format="integer" />
        <attr name="press_color" format="color" />
        <attr name="radius" format="dimension"/>
        <attr name="border_width" format="dimension" />
        <attr name="border_color" format="color"/>
        <attr name="shape_type" format="enum">
            <enum name="round" value="0"/>
            <enum name="rectangle" value="1" />
        </attr>
    </declare-styleable>
</resources>

values中创建colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ml_white">#ffffffff</color>
    <color name="ml_gray">#ff9e9e9e</color>
    <color name="ml_blue">#ff239efe</color>
    <color name="ml_red">#ffff0000</color>
</resources>

main中引用是加命名空间

 xmlns:melove="http://schemas.android.com/apk/res-auto"

main中引用控件

方形
<com.bwie.yuanxingtupian.MLImageView
        android:layout_width="96dp"
        android:layout_height="96dp"
        android:layout_margin="8dp"
        android:src="@drawable/touxiang"
        melove:radius="8dp"
        melove:shape_type="rectangle" />
圆形
    <com.bwie.yuanxingtupian.MLImageView
        android:layout_width="96dp"
        android:layout_height="96dp"
        android:layout_margin="8dp"
        android:src="@drawable/touxiang"
        melove:shape_type="round" />

方形加边框
    <com.bwie.yuanxingtupian.MLImageView
        android:layout_width="96dp"
        android:layout_height="96dp"
        android:layout_margin="8dp"
        android:src="@drawable/touxiang"
        melove:border_color="@color/ml_white"
        melove:border_width="4dp"
        melove:press_alpha="50"
        melove:press_color="#00ff00"
        melove:radius="8dp"
        melove:shape_type="rectangle" />
圆形加边框
    <com.bwie.yuanxingtupian.MLImageView
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:layout_margin="8dp"
        android:src="@drawable/touxiang"
        melove:border_color="@color/ml_white"
        melove:border_width="4dp"
        melove:shape_type="round" />

 

以上是关于圆形图片的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android的谷歌地图片段中更改默认的蓝色圆形位置图标?

寻求一 HTML(用CSS也可以)环形或圆形图片滚动代码

自定义View之一圆形图片

微信小程序裁剪图片成圆形

android圆形头像怎么实现

canvas应用——将方形图片处理为圆形