安卓实现圆形图片

继承与View

package com.example.k.myqq;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
 * Created by k on 2016/6/7.
 */
public class MyView extends View {
    int mHeight = 0,mWidth = 0;
    Bitmap bitmap = null;
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);
        //获得src元素的地址
        int attr = a.getIndex(0);
        //获得元素src的值
        bitmap = BitmapFactory.decodeResource(getResources(),
                a.getResourceId(attr, 0));
        a.recycle();
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int f = measuredWidth(widthMeasureSpec);
            int g = measuredHeight(heightMeasureSpec);
            setMeasuredDimension(f, g);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int min = Math.min(mWidth, mHeight);
        /**
         * 长度如果不一致,按小的值进行压缩
         */
        bitmap = Bitmap.createScaledBitmap(bitmap, min, min, false);
        canvas.drawBitmap(createCircleImage(bitmap, min), 0, 0, null);
    }
//************************************************************************************************
    private int measuredWidth(int widthMeasureSpec) {
        int Mode = MeasureSpec.getMode(widthMeasureSpec);
        int Size = MeasureSpec.getSize(widthMeasureSpec);
        if (Mode == MeasureSpec.EXACTLY) {
            mWidth = Size;
        } else {
            //由图片决定大小
            int value = getPaddingLeft()+getPaddingRight()+bitmap.getWidth();
            if (Mode == MeasureSpec.AT_MOST) {
                //由图片和Padding决定宽度,但是不能超过View的宽
                mWidth = Math.min(value,Size);
            }
        }
        return mWidth;
    }
//**********************************************************************************************
    private int measuredHeight(int heightMeasureSpec) {
        int Mode = MeasureSpec.getMode(heightMeasureSpec);
        int Size = MeasureSpec.getSize(heightMeasureSpec);
        if (Mode == MeasureSpec.EXACTLY) {
            mHeight = Size;
        } else {
            //由图片决定高度
            int intvalur1 = getPaddingTop()+getPaddingBottom()+bitmap.getHeight();
            if (Mode == MeasureSpec.AT_MOST) {
                //由图片和Padding决定大小,但是不能超过View的高
                mHeight = Math.min(intvalur1,Size);
            }
        }
        return mHeight;
    }
    private Bitmap createCircleImage(Bitmap source, int min)
    {
        final Paint paint = new Paint();
        paint.setAntiAlias(true);
        Bitmap target = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
        /**
         * 产生一个同样大小的画布
         */
        Canvas canvas = new Canvas(target);
        /**
         * 首先绘制圆形
         */
        canvas.drawCircle(min / 2, min / 2, min / 2, paint);
        /**
         * 使用SRC_IN模式显示后画图的交集处
         */
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        /**
         * 绘制图片
         */
        canvas.drawBitmap(source, 0, 0, paint);
        return target;
    }
}

values文件夹下的attr.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyView">
        <attr name="src" format="fraction"/>
    </declare-styleable>
</resources>
布局文件:

<com.example.k.myqq.MyView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:src="@drawable/test"
        />

实现圆形图片就是这么简单。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值