1. 程式人生 > >android圖片倒影程式碼,註釋

android圖片倒影程式碼,註釋

記錄下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,這裡只寫了倒影部分