天天看点

android放大镜效果实现

public class shaderview extends view {  

    private final bitmap bitmap;  

    private final shapedrawable drawable;  

    // 放大镜的半径  

    private static final int radius = 80;  

    // 放大倍数  

    private static final int factor = 3;  

    private final matrix matrix = new matrix();  

    public shaderview(context context) {  

        super(context);  

        bitmap bmp = bitmapfactory.decoderesource(getresources(),r.drawable.demo);  

        bitmap = bmp;  

        bitmapshader shader = new bitmapshader(bitmap.createscaledbitmap(bmp,  

                bmp.getwidth() * factor, bmp.getheight() * factor, true),  

                tilemode.clamp, tilemode.clamp);  

        // 圆形的drawable  

        drawable = new shapedrawable(new ovalshape());  

        drawable.getpaint().setshader(shader);  

        drawable.setbounds(0, 0, radius * 2, radius * 2);  

    }  

    @override  

    public boolean ontouchevent(motionevent event) {  

        final int x = (int) event.getx();  

        final int y = (int) event.gety();  

        // 这个位置表示的是,画shader的起始位置  

        matrix.settranslate(radius - x * factor, radius - y * factor);  

        drawable.getpaint().getshader().setlocalmatrix(matrix);  

        // bounds,就是那个圆的外切矩形  

        drawable.setbounds(x - radius, y - radius, x + radius, y + radius);  

        invalidate();  

        return true;  

    public void ondraw(canvas canvas) {  

        super.ondraw(canvas);  

        canvas.drawbitmap(bitmap, 0, 0, null);  

        drawable.draw(canvas);  

}  

基本原理就是使用shapedrawable构造一个圆形的drawable,然后它的paint的shader设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。

不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。

玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。

再来看看放大镜的另外一种实现吧

public class pathview extends view {  

    private final path mpath = new path();  

    private static final int factor = 2;  

    private int mcurrentx, mcurrenty;  

    public pathview(context context) {  

        mpath.addcircle(radius, radius, radius, direction.cw);  

        matrix.setscale(factor, factor);  

        bitmap = bitmapfactory.decoderesource(getresources(), r.drawable.demo);  

        mcurrentx = (int) event.getx();  

        mcurrenty = (int) event.gety();  

        // 底图  

        // 剪切  

        canvas.translate(mcurrentx - radius, mcurrenty - radius);  

        canvas.clippath(mpath);  

        // 画放大后的图  

        canvas.translate(radius - mcurrentx * factor, radius - mcurrenty  

                * factor);  

        canvas.drawbitmap(bitmap, matrix, null);  

这里使用的是path类,将canvas剪切出一块圆形区域,在其上绘制放大的部分。

android放大镜效果实现

继续阅读