Android 3D旋轉(zhuǎn)動畫庫

今天興趣來潮,擼了一個動畫特效伸刃,我把他應(yīng)用在登錄的界面,當(dāng)然也可以用在其他地方,先來預(yù)覽一下我的特效吧

預(yù)覽.gif

使用方法

  1. 在build.gradle里面配置如下
dependencies {
  compile 'com.jzp:rotate3D:1.0.0'
}
  1. 生成一個Rotate3D對象
   Rotate3D  anim = new Rotate3D.Builder(this)
            .bindParentView(parent_ll)
            .bindPositiveView(account_login_ll)
            .bindNegativeView(account_phone_ll)
            .create();

這里面必須要設(shè)置的參數(shù)是bindParentView惑灵,bindPositiveView,bindNegativeView眼耀,這些分別是父類View英支,正面View,以及旋轉(zhuǎn)后的反面View哮伟,有提供可選參數(shù)

  • setDuration 設(shè)置動畫時間
  • setDepthZ 設(shè)置Z軸深度
    可選參數(shù)未設(shè)置的話就使用默認的
  1. 啟動動畫
   anim.transform();

實現(xiàn)原理

由于android提供的動畫 alpha(淡入淡出)干花,translate(位移),scale(縮放大欣慊啤)池凄,rotate(旋轉(zhuǎn)),這些都是平面上的動畫鬼廓,那想要做3D立體的動畫肿仑,我們就需要從寫animation,3D立體動畫用到android的Camera庫碎税,Camera提供了三種旋轉(zhuǎn)方法:

  • rotateX()
  • rotateY()
  • rotateX()
    調(diào)用這三種方法尤慰,傳入旋轉(zhuǎn)角度參數(shù),即可實現(xiàn)視圖沿著坐標軸旋轉(zhuǎn)的功能雷蹂。

實現(xiàn)的核心代碼

public class Rotate3dAnimation extends Animation {
    private final float mFromDegrees;
    private final float mToDegrees;
    private final float mCenterX;
    private final float mCenterY;
    private final float mDepthZ;
    private final boolean mReverse;
    private Camera mCamera;
    float scale = 1;    // 像素密度

    /**
     * 創(chuàng)建一個繞 y 軸旋轉(zhuǎn)的3D動畫效果伟端,旋轉(zhuǎn)過程中具有深度調(diào)節(jié),可以指定旋轉(zhuǎn)中心匪煌。
     *
     * @param context     上下文,用于獲取像素密度
     * @param fromDegrees 起始時角度
     * @param toDegrees   結(jié)束時角度
     * @param centerX     旋轉(zhuǎn)中心x坐標
     * @param centerY     旋轉(zhuǎn)中心y坐標
     * @param depthZ      最遠到達的z軸坐標
     * @param reverse     true 表示由從0到depthZ责蝠,false相反
     */

    public Rotate3dAnimation(Context context, float fromDegrees, float toDegrees,
                             float centerX, float centerY, float depthZ, boolean reverse) {
        mFromDegrees = fromDegrees;
        mToDegrees = toDegrees;
        mCenterX = centerX;
        mCenterY = centerY;
        mDepthZ = depthZ;
        mReverse = reverse;
        // 獲取手機像素密度 (即dp與px的比例)
        scale = context.getResources().getDisplayMetrics().density;
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        mCamera = new Camera();
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final float fromDegrees = mFromDegrees;
        float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);

        final float centerX = mCenterX;
        final float centerY = mCenterY;
        final Camera camera = mCamera;
        final Matrix matrix = t.getMatrix();

        camera.save();
        // 調(diào)節(jié)深度
        if (mReverse) {
            camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
        } else {
            camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
        }
        // 繞y軸旋轉(zhuǎn)
        camera.rotateY(degrees);
        camera.getMatrix(matrix);
        camera.restore();

        // 修正失真
        float[] mValues = new float[9];
        matrix.getValues(mValues);                //獲取數(shù)值
        mValues[6] = mValues[6] / scale;            //數(shù)值修正
        mValues[7] = mValues[7] / scale;            //數(shù)值修正
        matrix.setValues(mValues);                //重新賦值

        // 調(diào)節(jié)中心點党巾,旋轉(zhuǎn)中心默認是坐標原點,對于圖片來說就是左上角位置霜医。
        matrix.preTranslate(-centerX, -centerY); // 使用pre將旋轉(zhuǎn)中心移動到和Camera位置相同
        matrix.postTranslate(centerX, centerY);  // 使用post將圖片(View)移動到原來的位置
    }
}

總結(jié)

代碼中的作用我都有寫注釋昧港,所以在這里就不多解釋了,有的時候支子,我們看一些特效覺得做起來一定很麻煩创肥,其實只要你掌握其實現(xiàn)原理,并不是很難值朋,所以給大家一句忠告叹侄,多讀源碼,對技術(shù)的提升很有幫助昨登。

參考文獻:http://www.reibang.com/p/153d9f31288d 我是根據(jù)這篇博客進行封裝的趾代,謝謝亦楓大神的分享

Github源碼下載:3D旋轉(zhuǎn)動畫庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丰辣,隨后出現(xiàn)的幾起案子撒强,更是在濱河造成了極大的恐慌,老刑警劉巖笙什,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飘哨,死亡現(xiàn)場離奇詭異,居然都是意外死亡琐凭,警方通過查閱死者的電腦和手機芽隆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來统屈,“玉大人胚吁,你說我怎么就攤上這事〕钽荆” “怎么了腕扶?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吨掌。 經(jīng)常有香客問我半抱,道長,這世上最難降的妖魔是什么思犁? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任代虾,我火速辦了婚禮进肯,結(jié)果婚禮上激蹲,老公的妹妹穿的比我還像新娘。我一直安慰自己江掩,他們只是感情好学辱,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布乘瓤。 她就那樣靜靜地躺著,像睡著了一般策泣。 火紅的嫁衣襯著肌膚如雪衙傀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天萨咕,我揣著相機與錄音统抬,去河邊找鬼。 笑死危队,一個胖子當(dāng)著我的面吹牛聪建,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茫陆,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼金麸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了簿盅?” 一聲冷哼從身側(cè)響起挥下,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桨醋,沒想到半個月后棚瘟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡喜最,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年解取,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片返顺。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡禀苦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遂鹊,到底是詐尸還是另有隱情振乏,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布秉扑,位于F島的核電站慧邮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舟陆。R本人自食惡果不足惜误澳,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秦躯。 院中可真熱鬧忆谓,春花似錦、人聲如沸踱承。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昙沦,卻和暖如春琢唾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盾饮。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工采桃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丘损。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓芍碧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親号俐。 傳聞我的和親對象是個殘疾皇子泌豆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件吏饿、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,096評論 4 62
  • 作者:呲西瓜滴鬼鬼
    呲西瓜滴鬼鬼閱讀 213評論 0 2
  • 我開始喜歡上課踪危,不知道為什么 不是因為老師,老師還是那樣抑揚頓挫 不是因為今天我是值日生 不是因為我坐在了后排可以...
    酸菜魚用機瞄閱讀 197評論 0 0