通過(guò)matrix
可以直接對(duì)Bitmap
進(jìn)行縮放要门、旋轉(zhuǎn)等操作,通過(guò)ImageView
的setImageMatrix(Matrix matrix)
方法也可以達(dá)到一樣的效果,不過(guò)要想
setImageMatrix(Matrix matrix)
生效,必須將ImageView
的ScaleType
設(shè)置為MATRIX
州丹。
使用ImageView
的setImageMatrix(Matrix matrix)
方法來(lái)實(shí)現(xiàn)傾斜效果相較于直接通過(guò)matrix
操作Bitmap
來(lái)實(shí)現(xiàn),好處在于我們可以預(yù)先通過(guò)成熟的圖片的加載框架(例如Glide
、Picasso
)來(lái)加載圖片墓毒,不用自己處理Bitmap
吓揪,以減少因Bitmap
導(dǎo)致的內(nèi)存溢出的幾率,在代碼上也更加簡(jiǎn)潔蚁鳖。
一個(gè)簡(jiǎn)單的示例:
device-2017-07-25-151401.png
實(shí)現(xiàn)代碼:
package com.hpplay.muiltythreaddemo;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.bumptech.glide.Glide;
/**
* Created by DON on 2017/7/25.
*/
public class MatrixFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
LinearLayout rootView = new LinearLayout(getActivity());
return rootView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
LinearLayout rootView = (LinearLayout) view;
rootView.setOrientation(LinearLayout.HORIZONTAL);
rootView.setGravity(Gravity.CENTER);
int imgWidth = 480, imgHeight = 300;
final ImageView leftImg = new ImageView(getActivity());
leftImg.setScaleType(ImageView.ScaleType.MATRIX);
LinearLayout.LayoutParams leftParams = new LinearLayout.LayoutParams(
imgWidth, imgHeight);
leftParams.leftMargin = 20;
rootView.addView(leftImg, leftParams);
ImageView centerImg = new ImageView(getActivity());
centerImg.setImageResource(R.drawable.im5);
LinearLayout.LayoutParams centerParams = new LinearLayout.LayoutParams(
imgWidth, imgHeight);
rootView.addView(centerImg, centerParams);
final ImageView rightImg = new ImageView(getActivity());
rightImg.setScaleType(ImageView.ScaleType.MATRIX);
LinearLayout.LayoutParams rightParams = new LinearLayout.LayoutParams(
imgWidth, imgHeight);
rightParams.rightMargin = 20;
rootView.addView(rightImg, rightParams);
//通過(guò)Glide加載圖片磺芭,會(huì)將原始圖片修改為與控件一樣大小,
// 不必再通過(guò)matrix對(duì)圖片進(jìn)行縮放醉箕,效率更高
Glide.with(getActivity())
.load(R.drawable.im5)
.into(leftImg);
Glide.with(getActivity())
.load(R.drawable.im5)
.into(rightImg);
//延時(shí)300ms等待Glide加載圖片完成,這里只做演示用徙垫,正確的處理方法應(yīng)為監(jiān)聽(tīng)Glide的加載進(jìn)度
rootView.postDelayed(new Runnable() {
@Override
public void run() {
rotateImg(leftImg, 30);
rotateImg(rightImg, -30);
}
}, 300);
}
/**
* 設(shè)置旋轉(zhuǎn)中心非常必要
* @param imageView
* @param rotateValue
*/
private void rotateImg(ImageView imageView, int rotateValue) {
Matrix matrix = getMatrix(rotateValue);
if (rotateValue >= 0) {
// 旋轉(zhuǎn)中心為(0,height/2)
matrix.preTranslate(0, -imageView.getHeight() / 2);
matrix.postTranslate(0, imageView.getHeight() / 2);
} else {
// 旋轉(zhuǎn)中心為(width,height/2)
matrix.preTranslate(-imageView.getWidth(), -imageView.getHeight() / 2);
matrix.postTranslate(imageView.getWidth(), imageView.getHeight() / 2);
}
imageView.setImageMatrix(matrix);
}
private Matrix getMatrix(int rotate) {
Matrix matrix = new Matrix();
Camera camera = new Camera();
camera.save();
camera.rotateY(rotate);
camera.getMatrix(matrix);
camera.restore();
return matrix;
}
}
這里的圖片傾斜效果是通過(guò)對(duì)matrix
設(shè)置繞Y
軸旋轉(zhuǎn)來(lái)實(shí)現(xiàn)的讥裤,直接使用matrix
只適用于對(duì)圖片進(jìn)行縮放、旋轉(zhuǎn)等處理姻报,對(duì)于普通的View
類(lèi)并不適用己英。View
類(lèi)的旋轉(zhuǎn)、縮放等可以通過(guò)直接調(diào)用其自有方法實(shí)現(xiàn)吴旋,也很是簡(jiǎn)單方便损肛。