Android笔记——自定义带圆框圆形头像框

继承 AppCompatImageView ,重写 绘制事件 onDraw 实现功能

头像保存与获取 保存在内部存储中

设置头像的同时,将头像图片保存

当加载头像控件时,获取头像图片并显示

需要以下权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

头像控件类

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
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 android.util.Log;


//import com.saqino.expensestatistics.R;
//import com.saqino.expensestatistics.utils.BitmapUtil;

public class HeadPortraitView extends android.support.v7.widget.AppCompatImageView {
    private Context context;

    private Paint paint_bitmap = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint paint_border = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Bitmap bitmap;
    private BitmapShader shader;
    private Matrix matrix = new Matrix();
    private float border_width = dip2px(5);
    private int border_color = Color.parseColor("#999999");

    public HeadPortraitView(Context context, @androidx.annotation.Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context = context;

        //准备了一张图片做显示效果
        //Drawable drawable = getResources().getDrawable(R.drawable.soji_3);

        //将图片保存到内部存储
        //BitmapUtil.saveHeadPortraitBitmap(context, ((BitmapDrawable) drawable).getBitmap());

        //初始化头像图片,也就是获取保存的图片
        initBitmap();
    }

    public void initBitmap(){
        //从内部存储中获取头像 如果没有头像,显示为白色
        bitmap = BitmapUtil.getHeadPortraitBitmap(context);
    }


    //保存头像的方法
    public void saveBitmap(Bitmap bitmap){
        if (tag.equals("changeable"))
            BitmapUtil.saveHeadPortraitBitmap(context, bitmap);
    }

    //修改头像方法
    public void setBitmap(Bitmap bitmap){
        saveBitmap(bitmap);
        this.bitmap = bitmap;
        //重新new一个shader,保证重绘时图片完整(之前忘记了这一步,把自己坑死了
        shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        //重绘
        invalidate();
    }

    //修改边框大小的方法
    public void setBorderWidth(int width){
        border_width = dip2px(width);
        this.invalidate();
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (bitmap != null){
            if (shader == null) {
                shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            }

            int viewWidth = getWidth();
            int viewHeight = getHeight();
            //拿到最小的边长,为了画圆(半径
            int viewMinSize = Math.min(viewWidth, viewHeight);

            //设置图片缩小的比例,根据线宽进行缩小
            matrix.setScale((viewMinSize - border_width) / bitmap.getWidth(), (viewMinSize - border_width) / bitmap.getHeight());
            shader.setLocalMatrix(matrix);

            paint_bitmap.setShader(shader);
            paint_bitmap.setAntiAlias(true);

            //画笔类型描边
            paint_border.setStyle(Paint.Style.STROKE);
            paint_border.setStrokeWidth(border_width);
            paint_border.setColor(border_color);
            //抗锯齿
            paint_border.setAntiAlias(true);

            float radius = viewMinSize / 2;

            //绘制圆框
            canvas.drawCircle(radius, radius, radius - border_width / 2f, paint_border);
            //canvas.translate(border_width, border_width);
            //绘制头像
            canvas.drawCircle(radius, radius, radius-border_width, paint_bitmap);
        }else {
            Log.i("Bitmap_error", "获取不到图片");
        }
    }

    //输入dp 转换为px
    private int dip2px(int dipVal) {
        //获取屏幕密度,1dp = *px
        float scale = getResources().getDisplayMetrics().density;
        return (int)(dipVal * scale + 0.5f);
    }

}

保存获取工具类

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Environment;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BitmapUtil {

    public static String HP_FILE_NAME = "headPortrait.jpg";
    public static String PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + HP_FILE_NAME;

    public static Bitmap getHeadPortraitBitmap(Context context) {

        try {
            FileInputStream in = context.openFileInput(HP_FILE_NAME);
            Bitmap bitmap = BitmapFactory.decodeStream(in);

            in.close();

            if (bitmap != null){
                return bitmap;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawColor(Color.WHITE);

        return bitmap;

    }

    public static void saveHeadPortraitBitmap(Context context, Bitmap bitmap){
        try {
            FileOutputStream out = context.openFileOutput(HP_FILE_NAME, Context.MODE_PRIVATE);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            out.write(stream.toByteArray());
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
            Log.i("IOException_save", "保存出错");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_15710245/article/details/96859829