记录下android图片倒影代码,基本上代码都是copy的。只是做个记录下次不用重新理解代码。
首先在xml文件中添加一个imageview,这个不多说,应该看得懂
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cc.lotuscard.myapptvtest.MainActivity">
<ImageView
android:id="@+id/daoying"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/testImage"
tools:layout_editor_absoluteX="111dp"
tools:layout_editor_absoluteY="67dp" />
</android.support.constraint.ConstraintLayout>
在xml中创建好ImageView之后在Activity中去获取到该控件
private ImageView daoying;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
daoying = (ImageView)findViewById(R.id.daoying);
}
获取该控件之后开始写得到图片倒影的方法DoReflection():方法的返回值可以是空,可以是返回Bitmap对象。最好是返回Bitmap对象,可以供不同控件使用。
private Bitmap DoReflection(Bitmap originalImage) {
//设置图片和倒影之间的间隙
final int reflectionGap = 4;
//获得图片的宽高
int width = originalImage.getWidth();
int height = originalImage.getHeight();
Matrix matrix = new Matrix();
matrix.preScale(1, -1.5f);//实现图片的反转
// 创建反转后的图片Bitmap对象,图片高是原图
//这里的height应该是为倒影图片从原图倒影过来时的高度起点位置,应该是倒过来的。但是不能为0
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
0, width, height , matrix, false);
// 创建标准的Bitmap对象,宽和原图一致,高是原图的0.3333倍
// 这里的height/3是用来控制倒影的从原点开始的1/3高度
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
height / 3, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmapWithReflection);
canvas.drawBitmap(originalImage, 0, 0, null);// 创建画布对象,将原图画于画布,起点是原点位置
Paint defaultPaint = new Paint();
canvas.drawRect(0, 0, width, height , defaultPaint);
// 将反转后的图片画到画布中
canvas.drawBitmap(reflectionImage, 0, 0, null);
Paint paint = new Paint();
// 创建线性渐变LinearGradient对象
LinearGradient shader = new LinearGradient(0,
0, 0, originalImage.getHeight()/3
, 0x70000000, 0x00000000,
Shader.TileMode.MIRROR);
// 绘制
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
// 画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果
canvas.drawRect(0, 0, width, bitmapWithReflection.getHeight()
, paint);
return bitmapWithReflection;
}
这就是基本的代码了
最后粘上全部的代码,避免下次使用时忘记了
public class MainActivity extends AppCompatActivity {
private ImageView daoying;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取图片控件
daoying = (ImageView)findViewById(R.id.daoying);
//获得该控件原本的图片
Bitmap originalImage = ((BitmapDrawable) daoying.getDrawable()).getBitmap();
DoReflection(originalImage);
}
private void DoReflection(Bitmap originalImage) {
//设置图片和倒影之间的间隙
final int reflectionGap = 4;
//获得图片的宽高
int width = originalImage.getWidth();
int height = originalImage.getHeight();
Matrix matrix = new Matrix();
matrix.preScale(1, -1);//实现图片的反转
// 创建反转后的图片Bitmap对象,图片高是原图的高度
//这里的高度height应该是图片倒影起点高度,但是不能为0
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
0, width, height, matrix, false);
// 创建标准的Bitmap对象,宽和原图一致,高是原图的0.25倍
//倒影图片的高度占比,这里只取了原图的1/4部分
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
height / 4, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmapWithReflection);
canvas.drawBitmap(originalImage, 0, 0, null);// 创建画布对象,将原图画于画布,起点是原点位置
Paint defaultPaint = new Paint();
canvas.drawRect(0, 0, width, height , defaultPaint);
// 将反转后的图片画到画布中
canvas.drawBitmap(reflectionImage, 0, 0, null);
Paint paint = new Paint();
// 创建线性渐变LinearGradient对象
LinearGradient shader = new LinearGradient(0,
0, 0, originalImage.getHeight()/4
, 0x70ffffff, 0x00ffffff,
Shader.TileMode.MIRROR);
// 绘制
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
// 画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果
canvas.drawRect(0, 0, width, bitmapWithReflection.getHeight()
, paint);
daoying.setImageBitmap(bitmapWithReflection);
}
}
这里是不是将原图和倒影放在一起的,分开来放,在项目需求中原图在选中时会加上焦点框,因此分成两个ImageView,这里只写了倒影部分