Android ImageView通過(guò)Matrix實(shí)現(xiàn)圖片傾斜效果

通過(guò)matrix可以直接對(duì)Bitmap進(jìn)行縮放要门、旋轉(zhuǎn)等操作,通過(guò)ImageViewsetImageMatrix(Matrix matrix)方法也可以達(dá)到一樣的效果,不過(guò)要想
setImageMatrix(Matrix matrix)生效,必須將ImageViewScaleType設(shè)置為MATRIX州丹。

使用ImageViewsetImageMatrix(Matrix matrix)方法來(lái)實(shí)現(xiàn)傾斜效果相較于直接通過(guò)matrix操作Bitmap來(lái)實(shí)現(xiàn),好處在于我們可以預(yù)先通過(guò)成熟的圖片的加載框架(例如GlidePicasso)來(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)單方便损肛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荣瑟,隨后出現(xiàn)的幾起案子治拿,更是在濱河造成了極大的恐慌,老刑警劉巖笆焰,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劫谅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嚷掠,警方通過(guò)查閱死者的電腦和手機(jī)捏检,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)不皆,“玉大人贯城,你說(shuō)我怎么就攤上這事∨Γ” “怎么了能犯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)项棠。 經(jīng)常有香客問(wèn)我悲雳,道長(zhǎng),這世上最難降的妖魔是什么香追? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任合瓢,我火速辦了婚禮,結(jié)果婚禮上透典,老公的妹妹穿的比我還像新娘晴楔。我一直安慰自己顿苇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布税弃。 她就那樣靜靜地躺著纪岁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪则果。 梳的紋絲不亂的頭發(fā)上幔翰,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音西壮,去河邊找鬼遗增。 笑死,一個(gè)胖子當(dāng)著我的面吹牛款青,可吹牛的內(nèi)容都是我干的做修。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抡草,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饰及!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起康震,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤燎含,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后签杈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瘫镇,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年答姥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铣除。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹦付,死狀恐怖尚粘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敲长,我是刑警寧澤郎嫁,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站祈噪,受9級(jí)特大地震影響泽铛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辑鲤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一盔腔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦弛随、人聲如沸瓢喉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栓票。三九已至,卻和暖如春愕够,著一層夾襖步出監(jiān)牢的瞬間走贪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工惑芭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厉斟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓强衡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親码荔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漩勤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容