天天看點

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放大鏡效果實作

繼續閱讀