0
点赞
收藏
分享

微信扫一扫

图片倒影控件ReflectionImage


ReflectionImage是从android.widget.ImageView继承而来,使用方法和其他的Android控件一样 


实现思路是从某个网站上剽窃过来的。 


实现起来很简单,详细的解释写到注释里面,总体思路就是在Canvas里面重新把原始图片画一次,反转图片用Matrix来做,透明处理实际上是加了一层渐变的蒙板. 


源码如下: 



    
1. importandroid.content.Context;  
2. importandroid.graphics.Bitmap;  
3. importandroid.graphics.BitmapFactory;  
4. importandroid.graphics.Canvas;  
5. importandroid.graphics.LinearGradient;  
6. importandroid.graphics.Matrix;  
7. importandroid.graphics.Paint;  
8. importandroid.graphics.PorterDuffXfermode;  
9. importandroid.graphics.Bitmap.Config;  
10. importandroid.graphics.PorterDuff.Mode;  
11. importandroid.graphics.Shader.TileMode;  
12. importandroid.graphics.drawable.BitmapDrawable;  
13. importandroid.util.AttributeSet;  
14. importandroid.widget.ImageView;  
15. publicclassReflectionImage extendsImageView {  
16.    //是否为Reflection模式 
17.    privatebooleanmReflectionMode = true;  
18.    publicReflectionImage(Context context) {  
19.        super(context);  
20.    }  
21.    publicReflectionImage(Context context, AttributeSet attrs) {  
22.        super(context, attrs);  
23.        //取得原始图片的bitmap并重画 
24.        Bitmap originalImage = ((BitmapDrawable)this.getDrawable()).getBitmap();  
25.        DoReflection(originalImage);  
26.    }  
27.    publicReflectionImage(Context context, AttributeSet attrs,  
28.            intdefStyle) {  
29.        super(context, attrs, defStyle);  
30.        Bitmap originalImage = ((BitmapDrawable)this.getDrawable()).getBitmap();  
31.        DoReflection(originalImage);  
32.    }  
33.    publicvoidsetReflectionMode(booleanisRef) {  
34.        mReflectionMode = isRef;  
35.    }  
36.    publicbooleangetReflectionMode() {  
37.        returnmReflectionMode;  
38.    }  
39.    //偷懒了,只重写了setImageResource,和构造函数里面干了同样的事情 
40.    @Override 
41.    publicvoidsetImageResource(intresId) {  
42.        Bitmap originalImage = BitmapFactory.decodeResource(  
43.                getResources(), resId);  
44.        DoReflection(originalImage);  
45.        //super.setImageResource(resId); 
46.    }  
47.    privatevoidDoReflection(Bitmap originalImage) {  
48.        finalintreflectionGap = 4;                            //原始图片和反射图片中间的间距 
49.        intwidth = originalImage.getWidth();  
50.        intheight = originalImage.getHeight();  
51.          
52.        //反转 
53.        Matrix matrix = newMatrix();  
54.        matrix.preScale(1, -1);  
55.      //reflectionImage就是下面透明的那部分,可以设置它的高度为原始的3/4,这样效果会更好些 
56.        Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,  
57.                0, width, height, matrix, false);  
58.        //创建一个新的bitmap,高度为原来的两倍 
59.        Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height), Config.ARGB_8888);  
60.        Canvas canvasRef = newCanvas(bitmapWithReflection);  
61.          
62.        //先画原始的图片 
63.        canvasRef.drawBitmap(originalImage, 0, 0, null);  
64.        //画间距 
65.        Paint deafaultPaint = newPaint();  
66.        canvasRef.drawRect(0, height, width, height + reflectionGap, deafaultPaint);  
67.          
68.        //画被反转以后的图片 
69.        canvasRef.drawBitmap(reflectionImage, 0, height + reflectionGap, null);  
70.        // 创建一个渐变的蒙版放在下面被反转的图片上面 
71.        Paint paint = newPaint();  
72.        LinearGradient shader = newLinearGradient(0,  
73.                originalImage.getHeight(), 0, bitmapWithReflection.getHeight()  
74.                        + reflectionGap, 0x80ffffff, 0x00ffffff, TileMode.CLAMP);  
75.        // Set the paint to use this shader (linear gradient) 
76.        paint.setShader(shader);  
77.        // Set the Transfer mode to be porter duff and destination in 
78.        paint.setXfermode(newPorterDuffXfermode(Mode.DST_IN));  
79.        // Draw a rectangle using the paint with our linear gradient 
80.        canvasRef.drawRect(0, height, width, bitmapWithReflection.getHeight()  
81.                + reflectionGap, paint);  
82.      //调用ImageView中的setImageBitmap 
83.        this.setImageBitmap(bitmapWithReflection);  
84.    }  
85. }


android 圆角与倒影 

http://lipeng88213.iteye.com/blog/1201993 

http://www.devdiv.com/article-2516-1.html


举报

相关推荐

0 条评论