在很多的手机和电视应用中,好看的效果都离不开倒影。
而目前大部分的都是在同一个imageview中做倒影,也就是原图和倒影图一起,重新组合成一个图片并绘画上去。
但是对于一些可以选中,但是倒影不需要放大和变化的应用来说,并不符合实际的开发需求。
因此,对于这样的需求,可以考虑2个imagview来实现,上下来叠加,一个可以focused,另外一个只作为获取前一个的原图并倒影处理。
具体的代码如下:
public class ReflectImageView extends ImageView {
private boolean mReflectionMode = true;
ReflectImageView imageview;
Bitmap bitmap;
Handler handler = new Handler(Looper.getMainLooper()) {
public void handleMessage(android.os.Message msg) {
if (msg.what == 0x9999) {
imageview.setImageBitmap(bitmap);
}
};
};
public ReflectImageView(Context context) {
this(context, null);
}
public ReflectImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ReflectImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
imageview = this;
}
public void setReflectionMode(boolean isRef) {
mReflectionMode = isRef;
}
public boolean getReflectionMode() {
return mReflectionMode;
}
public Bitmap createReflectedImage(Bitmap originalImage) {
int width = originalImage.getWidth();
int height = originalImage.getHeight();
Matrix matrix = new Matrix();
// 实现图片翻转90度
matrix.preScale(1, -1);
// 创建倒影图片(是原始图片的同样大小)
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, 0,
width, height, matrix, false);
// 创建倒影图片
Bitmap finalReflection = Bitmap.createBitmap(width, height,
Config.ARGB_8888);
// 创建画布
Canvas canvas = new Canvas(finalReflection);
// canvas.drawBitmap(originalImage, 0, 0, null);
// 把倒影图片画到画布上
canvas.drawBitmap(reflectionImage, 0, 0, null);
Paint shaderPaint = new Paint();
// 创建线性渐变LinearGradient对象
LinearGradient shader = new LinearGradient(0, 0, 0, 100, 0x20ffffff,
0x00ffffff, TileMode.CLAMP);
shaderPaint.setShader(shader);
shaderPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// 画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果。
canvas.drawRect(0, 0, width, finalReflection.getHeight(), shaderPaint);
return finalReflection;
}
public void StartReflect(Bitmap bitmap){
this.setScaleType(ScaleType.CENTER_CROP);
ImageViewAsync async=new ImageViewAsync();
async.execute(bitmap);
}
class ImageViewAsync extends AsyncTask<Bitmap, Bitmap, Bitmap> {
@Override
protected Bitmap doInBackground(Bitmap... params) {
// TODO Auto-generated method stub
return createReflectedImage(params[0]);
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
bitmap=result;
handler.sendEmptyMessage(0x9999);
}
}
值得注意的是,做倒影的imageview应与原图的imageview的宽高要一致,不然会出现压扁的处理,这对于一些要求center_crop以达到美观效果的同样适用
当然其他缩放模式的话只要改下代码中的缩放模式就好了。