android 使用BitmapShader实现圆形以及放大镜效果

本文介绍了如何使用Android的BitmapShader实现圆形图片显示及放大镜效果。通过BitmapShader的渲染模式,包括CLAMP、MIRROR和REPEAT,展示了如何处理图片的显示。文章提供了两种实现圆形图片的方法,并讨论了非正方形图片的处理策略,包括缩小和放大两种解决方案。最后,详细讲解了放大镜功能的实现,通过动态调整圆心位置来截取放大后的图片部分。
摘要由CSDN通过智能技术生成

在一些显示用户头像的时候,大多数都是显示圆形的,而不是显示一个正方形或者长方形,这样显得很呆板,视觉效果也不好看,今天就用二种方式实现图片圆形显示的效果,在先讲这个效果实现之前,讲下BitmapShader到底能干嘛,android有几个关于渲染的类,使用它能实现一些不错的效果,比如今天讲的BitmapShader的就是关于图像渲染,还有其他4种,这都会再以后都会以博客的形式写出来,今天就单独讲讲BitmapShader,进入BitmapShader源码发现这是你见过最简单的系统类源码了

package android.graphics;

public class BitmapShader extends android.graphics.Shader {
    public BitmapShader(android.graphics.Bitmap bitmap, android.graphics.Shader.TileMode tileX, android.graphics.Shader.TileMode tileY) { /* compiled code */ }
}
这构造函数中就三个参数,简单说明下:

第一个bitmap:就是你渲染图像对象

第二个参数tileX:就是你x轴方向渲染模式

第三个参数tileY:就是你y轴方向渲染模式

关于渲染模式有三种:

从上面的代码中知道BitmapShader是继承了Shader类,而模式就是定义在Shader中的一个枚举而已

package android.graphics;

public class Shader {
    public Shader() { /* compiled code */ }

    public boolean getLocalMatrix(android.graphics.Matrix localM) { /* compiled code */ }

    public void setLocalMatrix(android.graphics.Matrix localM) { /* compiled code */ }

    protected void finalize() throws java.lang.Throwable { /* compiled code */ }

    public static enum TileMode {
        CLAMP, MIRROR, REPEAT;

        private TileMode() { /* compiled code */ }
    }
}
从代码中我们就清晰的看到定义的TileMode有三种

CLAMP:当view控件宽或者高大于你渲染图形的大小时,拉伸最后一个像素去铺满剩下的地方

MIRROR:当view控件宽或者高大于你渲染图形的大小时,通过镜像翻转铺满剩下的地方

REPEAT:当view控件宽或者高大于你渲染图形的大小时,重复图片平铺整个画面(电脑设置壁纸)

等下会说这个三个模式,先把第一种实现圆形的方式代码贴下:

package com.bitmapshaderdemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
 * Created by admin on 2016/11/22.
 */
public class RoundHeadView extends View {
    private static final String TAG ="RoundHeadView" ;
    private Paint mPaint;
    private ShapeDrawable shapeDrawable;
    private BitmapShader bitmapShaderp;
    public RoundHeadView(Context context) {
        this(context,null);
    }
    public RoundHeadView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public RoundHeadView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
        init();
        setBackgroundColor(Color.RED);
    }
    private void init() {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.gird);
        Log.e(TAG,"-"+bitmap.getWidth()+"-"+""+bitmap.getHeight());
        shapeDrawable = new ShapeDrawable(new OvalShape());
        bitmapShaderp = new BitmapShader(bitmap, Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
        shapeDrawable.getPaint().setShader(bitmapShaderp);
    }
    private void initPaint() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        shapeDrawable.draw(canvas);
    }
}
运行起来看效果:


发现屏幕一片空白,这是为什么呢? 是因为你没给图片显示设置位置,哪可能会说我我这个自定义view的宽和高就是屏幕的宽和高,但是你必须要给shapeDrawable设置显示区域,

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    shapeDrawable.setBounds(200,200,400,400);
    shapeDrawable.draw(canvas);
}
我们在onDraw()方法中指定了显示的区域,就是一个矩形区域,现在运行看效果


ok,一个美女头像出来了,这是一种实现方式,下面不使用ShapeDrawable再实现下:

package com.bitmapshaderdemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值