本文源自:http://blog.csdn.net/kenshintang1215/article/details/5804236


效果图如下:


代码如下:

package lab.sodino.reflection;    import android.content.Context;  import android.graphics.Bitmap;  import android.graphics.Bitmap.Config;  import android.graphics.BitmapFactory;  import android.graphics.Canvas;  import android.graphics.LinearGradient;  import android.graphics.Matrix;  import android.graphics.Paint;  import android.graphics.PorterDuff.Mode;  import android.graphics.PorterDuffXfermode;  import android.graphics.Shader.TileMode;  import android.graphics.drawable.BitmapDrawable;  import android.util.AttributeSet;  import android.widget.ImageView;    public class ReflectionImage extends ImageView {      // 是否为Reflection模式      private boolean mReflectionMode = true;        public ReflectionImage(Context context) {          super(context);      }        public ReflectionImage(Context context, AttributeSet attrs) {          super(context, attrs);          measure(0, 0);          // 取得原始图片的bitmap并重画          Bitmap originalImage = ((BitmapDrawable) this.getDrawable()).getBitmap();          DoReflection(originalImage);      }        public ReflectionImage(Context context, AttributeSet attrs, int defStyle) {          super(context, attrs, defStyle);          Bitmap originalImage = ((BitmapDrawable) this.getDrawable()).getBitmap();          DoReflection(originalImage);      }        public void setReflectionMode(boolean isRef) {          mReflectionMode = isRef;      }        public boolean getReflectionMode() {          return mReflectionMode;      }        // 偷懒了,只重写了setImageResource,和构造函数里面干了同样的事情      @Override      public void setImageResource(int resId) {          Bitmap originalImage = BitmapFactory.decodeResource(getResources(), resId);          DoReflection(originalImage);          // super.setImageResource(resId);      }        private void DoReflection(Bitmap originalImage) {          // 原始图片和反射图片中间的间距          final int reflectionGap = 4;          int width = originalImage.getWidth();          int height = originalImage.getHeight();          // 反转          Matrix matrix = new Matrix();          // 第一个参数为1表示x方向上以原比例为准保持不变,正数表示方向不变。          // 第二个参数为-1表示y方向上以原比例为准保持不变,负数表示方向取反。          matrix.preScale(1, -0.75f);          // reflectionImage就是下面透明的那部分,可以设置它的高度为原始的3/4,这样效果会更好些          Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, 0, width, height * 3 / 4, matrix, false);          // 创建一个新的bitmap,高度为原来的两倍          Bitmap bitmap4Reflection = Bitmap.createBitmap(width, (height + height * 3 / 4), Config.ARGB_8888);          // 其宽*高 = width * (height + height * 3 / 4)          Canvas canvasRef = new Canvas(bitmap4Reflection);          // 先画原始的图片          canvasRef.drawBitmap(originalImage, 0, 0, null);          // 画间距          Paint deafaultPaint = new Paint();          // defaultPaint不能为null,否则会有空指针异常。          canvasRef.drawRect(0, height, width, height + reflectionGap, deafaultPaint);          // 画被反转以后的图片          canvasRef.drawBitmap(reflectionImage, 0, height + reflectionGap, null);          // 创建一个渐变的蒙版放在下面被反转的图片上面          Paint paint = new Paint();          LinearGradient shader = new LinearGradient(200, originalImage.getHeight(), 10, bitmap4Reflection.getHeight()                  + reflectionGap, 0x80ffffff, 0x00ffffff, TileMode.CLAMP);          paint.setShader(shader);          // Set the Transfer mode to be porter duff and destination in          paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));          // 将蒙板画上          canvasRef.drawRect(0, height, width, bitmap4Reflection.getHeight() + reflectionGap, paint);          // 调用ImageView中的setImageBitmap          this.setImageBitmap(bitmap4Reflection);      }  }  

转自:http://blog.csdn.net/sodino/article/details/6797177

更多相关文章

  1. android保存图片到图库
  2. Android图片解决方案
  3. Android(安卓)圆角图片 圆形图片
  4. Android(安卓)view 转化为Bitmap并保存在本地
  5. android 关于图片的放大,缩小,旋转功能的实现(附源码)
  6. Android(安卓)Toast
  7. Android(安卓)Fresco的使用
  8. android 轮播图无限循环,自动播放
  9. Android文件图片上传的详细讲解(三)---模式回调类

随机推荐

  1. Android架构组件(2)LifecycleRegistry 源码
  2. Android(安卓)实现 Launcher
  3. Android实现手机摄像头的自动对焦
  4. Android(安卓)系统启动流程
  5. Android的 EditText的inputType类型
  6. 在Maven项目中使用Android(安卓)Support
  7. Android(安卓)error 处理-有空就更新
  8. Android(安卓)ActionBar和ToolBar的使用
  9. Android控件之AutoCompleteTextView、Mul
  10. Android(安卓)CoordinatorLayout实战案例