android圖片倒影程式碼,註釋
阿新 • • 發佈:2019-02-15
記錄下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,這裡只寫了倒影部分