Android自定義控件實現圓形圖片

前言:我們都知道as(Android Studio)裏面的所有可以使用圖片的控件,都是方方正正的,如果我們做頭像作用時,方方正正的就很奇怪,我們就想要一個圓的圖片了。這裏介紹一種自定義控件的方式來實現。

                            我們預計的效果:                                                       

首先,先自定義一個Java類;並實現圓的效果,代碼如下。

package com.c201801090105.example.pengjian;


import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;

import androidx.annotation.Nullable;

public class Circle extends androidx.appcompat.widget.AppCompatImageView {

    //畫筆
    private Paint mPaint;
    //圓形圖片的半徑
    private int mRadius;
    //圖片的宿放比例
    private float mScale;

    public Circle(Context context) {
        super(context);
    }

    public Circle(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public Circle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //由於是圓形,寬高應保持一致
        int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
        mRadius = size / 2;
        setMeasuredDimension(size, size);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onDraw(Canvas canvas) {

        mPaint = new Paint();

        Drawable drawable = getDrawable();

        if (null != drawable) {
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

            //初始化BitmapShader,傳入bitmap對象
            BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            //計算縮放比例
            mScale = (mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth());

            Matrix matrix = new Matrix();
            matrix.setScale(mScale, mScale);
            bitmapShader.setLocalMatrix(matrix);
            mPaint.setShader(bitmapShader);
            //畫圓形,指定好座標,半徑,畫筆
            canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
        } else {
            super.onDraw(canvas);
        }
    }

}

然後,在佈局文件裏面直接使用即可。

 <com.c201801090105.example.pengjian.Circle
            android:id="@+id/touxiang"
            android:layout_width="100dp"
            android:layout_height="100dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:srcCompat="@drawable/dibu" />

注意:

 

這種方法必須是設置src,設置background不會生效

在ImageView中src與background是有區別的

background會根據ImageView組件給定的長寬進行拉伸,而src就存放的是原圖的大小,不會進行拉伸。src是圖片內容(前景),bg是背景,可以同時使用。此外scaleType只是對src起作用,bg可設置透明度。

在動態加載圖片中設置src可以參考imageview的幾種設置方式
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章