Mars視頻筆記-Animation的使用

1.什么是Animations

  • Animations提供了一系列的動(dòng)畫(huà)效果,這些效果可以應(yīng)用在絕大多數(shù)的控件.

2.Animations的分類(lèi)

  • 代碼中實(shí)現(xiàn)動(dòng)畫(huà)
  • xml中使用動(dòng)畫(huà)

總體分兩大類(lèi)

  • 第一類(lèi):Tweened Animations
    該類(lèi)Animations提供了旋轉(zhuǎn),移動(dòng),伸展和淡出等等效果

  • 1.Alpha :淡入淡出效果

  • 2.Scale:縮放效果

  • 3.Rotate:旋轉(zhuǎn)效果

  • 4.Translate:移動(dòng)效果

  • 第二類(lèi):Frame-by-Frame Animations
    這一類(lèi)Animations可以創(chuàng)建一個(gè)Drawable序列婴削,這些Drawable可以按照指定的時(shí)間間歇一個(gè)一個(gè)的顯示偿枕;

  • 使用Tweened Animations 的步驟

1.創(chuàng)建一個(gè)AnimationSet對(duì)象
2.根據(jù)需要?jiǎng)?chuàng)建相應(yīng)的Animation對(duì)象
3.根據(jù)軟件動(dòng)畫(huà)的需求,為Animation對(duì)象設(shè)置相應(yīng)的數(shù)據(jù)
4.將Animation對(duì)象添加到AnimationSet對(duì)象當(dāng)中
5.使用空間對(duì)象開(kāi)始執(zhí)行AnimationSet

  • Tween Animation的通用屬性

1.setDuration(long durationMils) 設(shè)置動(dòng)畫(huà)持續(xù)時(shí)間(單位毫秒)
2.setFillAfter(boolean fillAfter)
如果fillAfter的值為true,則動(dòng)畫(huà)執(zhí)行后,控件將停留在執(zhí)行結(jié)束的狀態(tài)
3.setFillBefore(boolean fillBefore)
如果fillBefore的值為true;則動(dòng)畫(huà)執(zhí)行后嗅绸,控件將回到動(dòng)畫(huà)執(zhí)行之前的狀態(tài);
4.setStartOffset(long startOffSet)
設(shè)置動(dòng)畫(huà)執(zhí)行之前的等待時(shí)間
5.setRepeatCount(int repearCount)
設(shè)置動(dòng)畫(huà)重復(fù)執(zhí)行的次數(shù)

Paste_Image.png
(在代碼中實(shí)現(xiàn)動(dòng)畫(huà))實(shí)例代碼:

<pre><code>package mars.animations01;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private ImageView imageView = null;
private Button rotateButton = null;
private Button scaleButton = null;
private Button alphaButton = null;
private Button translateButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.imageViewId);
rotateButton = (Button) findViewById(R.id.rotateButtonId);
rotateButton.setOnClickListener(new RotateButtonListener());
scaleButton = (Button) findViewById(R.id.scaleButtonId);
scaleButton.setOnClickListener(new ScaleButtonListener());
alphaButton = (Button) findViewById(R.id.alphaButtonId);
alphaButton.setOnClickListener(new AlphaButtonListener());
translateButton = (Button) findViewById(R.id.translateButtonId);
translateButton.setOnClickListener(new TranslateButtonListener());
}
private class RotateButtonListener implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet animationSet = new AnimationSet(true);
RotateAnimation rotateAnimation = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_PARENT, 1f,
Animation.RELATIVE_TO_PARENT, 0f);
rotateAnimation.setDuration(5000);
animationSet.addAnimation(rotateAnimation);
imageView.startAnimation(animationSet);
}
}
private class ScaleButtonListener implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet animationSet = new AnimationSet(true);
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.1f, 1, 0.1f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
animationSet.addAnimation(scaleAnimation);
animationSet.setStartOffset(1000);
animationSet.setFillAfter(true);
animationSet.setFillBefore(false);
animationSet.setDuration(2000);
imageView.startAnimation(animationSet);
}
}
private class AlphaButtonListener implements OnClickListener {
@Override
public void onClick(View view) {
//創(chuàng)建一個(gè)AnimationSet對(duì)象
AnimationSet animationSet = new AnimationSet(true);
//創(chuàng)建一個(gè)AlphaAnimation對(duì)象
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
//設(shè)置動(dòng)畫(huà)執(zhí)行的時(shí)間(單位:毫秒)
alphaAnimation.setDuration(1000);
//將AlphaAnimation對(duì)象添加到AnimationSet當(dāng)中
animationSet.addAnimation(alphaAnimation);
//使用ImageView的startAnimation方法開(kāi)始執(zhí)行動(dòng)畫(huà)
imageView.startAnimation(animationSet);
}
}
private class TranslateButtonListener implements OnClickListener {
@Override
public void onClick(View view) {
AnimationSet animationSet = new AnimationSet(true);
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 1.0f);
translateAnimation.setDuration(1000);
animationSet.addAnimation(translateAnimation);
imageView.startAnimation(animationSet);
}
}
}</pre></code>

(在xml文件中實(shí)現(xiàn)):
首先需要在res文件夾下新建anim文件夾
然后可以在anim文件夾中新建xml文件
alpha.xml

 <?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android"
 android:interpolator="@android:anim/accelerate_interpolator">
         <alpha 
      android:fromAlpha="1.0"
      android:toAlpha="0.0"
      android:startOffset="500"
      android:duration="500" />

 </set>

rotate.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<rotate android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="5000" />
</set>
  1. android:pivotX="50" 這種方法是用絕對(duì)位置定位撕彤;
  2. android:pivotX="50%"這種方法相對(duì)于控件本身定位鱼鸠;
  3. android:pivotX="50%p"這種方法相對(duì)于控件的父控件定位

scale.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<scale android:fromXScale="1.0" 
    android:toXScale="0.0"
    android:fromYScale="1.0" 
    android:toYScale="0.0" 
    android:pivotX="50%"
    android:pivotY="50%" 
    android:duration="2000" />
</set>

translate.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate 
    android:fromXDelta="50%" 
    android:toXDelta="100%" 
    android:fromYDelta="0%" 
    android:toYDelta="100%" 
    android:duration="2000" />
</set>

如何在java代碼中使用anim:
Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha); imageView.startAnimation(animation);

AnimationSet的使用方法

什么是AnimationSet

1.AnimationSet是Animation的子類(lèi),可以整合各種動(dòng)畫(huà)效果
2.一個(gè)AnimationSet包含了一系列的Animation
3.針對(duì)AnimationSet設(shè)置一些Animation的常見(jiàn)屬性羹铅,可以被包含在AnimationSet當(dāng)中的Animation集成

實(shí)例瞧柔,實(shí)現(xiàn)漸變和旋轉(zhuǎn)

public class MainActivity extends Activity {
private Button button = null;
private ImageView imageView = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    imageView = (ImageView) findViewById(R.id.imageViewId);
    button = (Button) findViewById(R.id.scaleButtonId);
    button.setOnClickListener(new AnimationButtonListener());
}

private class AnimationButtonListener implements OnClickListener {

    @Override
    public void onClick(View v) {
        /**
         * Animation animation =
         * AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
         * imageView.startAnimation(animation);
         */
        // 聲明一個(gè)AnimationSet對(duì)象
        AnimationSet animationSet = new AnimationSet(false);
        //false 設(shè)置android:shareInterpolator為false,true設(shè)置android:shareInterpolator為true
        //animationSet.setInterpolator(new AccelerateInterpolator());
        AlphaAnimation alpha = new AlphaAnimation(1.0f, 0.0f);
        alpha.setInterpolator(new DecelerateInterpolator());
        RotateAnimation rotate = new RotateAnimation(0, 360,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setInterpolator(new AccelerateInterpolator());
        animationSet.addAnimation(alpha);
        animationSet.addAnimation(rotate);
        animationSet.setDuration(2000);
        animationSet.setStartOffset(500);
        imageView.startAnimation(animationSet);
    }

}
}

Interpolator 的使用方法-控制動(dòng)畫(huà)使用效果(ex:前慢后快)

Interpolator定義了動(dòng)畫(huà)變化的速率睦裳,在Animations框架當(dāng)中定義了以下幾種

Interpolator

  • AccelerateDecelerateInterpolator:在動(dòng)畫(huà)開(kāi)始與結(jié)束的地方速率改變比較慢造锅,在中間的時(shí)候加速
  • AccelerateInterpolator:在動(dòng)畫(huà)開(kāi)始的地方速率改變比較慢,然后開(kāi)始加速
  • CycleInterpolator:動(dòng)畫(huà)循環(huán)播放特定的次數(shù)廉邑,速率改變沿著正弦曲線(xiàn)
  • DecelerateInterpolator:在動(dòng)畫(huà)開(kāi)始的地方速率改變比較慢哥蔚,然后開(kāi)始減速
  • LinearInterpolator:動(dòng)畫(huà)以均勻的速率改變
    在xml文件中設(shè)置Interpolator


    Paste_Image.png
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
    
<alpha 
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:startOffset="500"
    android:duration="2000" />

<rotate android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="2000" />
</set>

如果shereInterpolator= "false" 則需要對(duì)AnimationSet中的每一個(gè)動(dòng)畫(huà)設(shè)置Interpolator屬性

Frame-By-Frame Animations的使用方法

在res/drawable當(dāng)中創(chuàng)建一個(gè)xml文件倒谷,用于定義Animations的動(dòng)畫(huà)序列

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/nv1" android:duration="500" />
<item android:drawable="@drawable/nv2" android:duration="500" />
<item android:drawable="@drawable/nv3" android:duration="500" />
<item android:drawable="@drawable/nv4" android:duration="500" />
</animation-list>

使用方法

1.為imageView設(shè)置背景資源
imageView.setBackgroundResource(R.drawable.anim_nv);
2.通過(guò)ImageView得到AnimationDrawable
AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getBackground();
3.開(kāi)始執(zhí)行動(dòng)畫(huà)
animationDrawable.start();

LayoutAnimationController的使用方法

  • 什么是LayoutAnimationController

    1. LayoutAnimationController用于為一個(gè)layout里面的控件,或者是一個(gè)ViewGroup里面的控件設(shè)置動(dòng)畫(huà)效果;

    2.每一個(gè)控件都有相同的動(dòng)畫(huà)效果
    3.這些控件的動(dòng)畫(huà)效果在不同的時(shí)間顯示出來(lái)
    4.LayoutAnimationController可以在xml文件當(dāng)中設(shè)置糙箍,也可以在代碼當(dāng)中進(jìn)行設(shè)置渤愁。

在xml文件中使用LayoutAnimationController
在anim文件夾下創(chuàng)建一個(gè)新文件,名為list_anim_layout.xml文件

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="2"
android:animationOrder="normal" //有三個(gè)值random,normal,reverse
android:animation="@anim/list_anim" />

list_anim.xml文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
<alpha 
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="2000" />
</set>

main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
    android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical" 
    android:layoutAnimation="@anim/list_anim_layout"
    //當(dāng)在代碼中使用LayoutAnimationController時(shí)深夯,去掉此屬性
    />

<Button
    android:id="@+id/buttonId"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="測(cè)試" />

</LinearLayout>

代碼中使用LayoutAnimationController

1.創(chuàng)建一個(gè)Animation對(duì)象
2.使用如下代碼創(chuàng)建LayoutAnimationController對(duì)象:
LayoutAnimationController lac = new LayoutAnimationController(animation);
3.設(shè)置控件顯示的順序:
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
4.為L(zhǎng)istView設(shè)置LayoutAnimationController屬性
listView.setLayoutAnimation(lac);

Animation animation = (Animation) AnimationUtils.loadAnimation(
                MainActivity.this, R.anim.list_anim);
        LayoutAnimationController lac = new LayoutAnimationController(
                animation);
        lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
        lac.setDelay(0.5f);
        listView.setLayoutAnimation(lac);

AnimationListenter的使用方法

1.AnimationListenter是一個(gè)監(jiān)聽(tīng)器
2.該監(jiān)聽(tīng)器在動(dòng)畫(huà)執(zhí)行的各個(gè)階段會(huì)得到通知抖格,而調(diào)用相應(yīng)的方法
3.主要包含以下的三個(gè)方法

1.onAnimationEnd(Animation animation)
2.onAnimationRepeat(Animation animation)
3.onAnimationStart(Animation animation)

代碼示例:
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private Button removeButton = null;
private Button addButton = null;
private ImageView imageView = null;
private ViewGroup viewGroup = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    removeButton = (Button) findViewById(R.id.removeButtonId);
    imageView = (ImageView) findViewById(R.id.imageViewId);
    removeButton.setOnClickListener(new RemoveButtonListener());
    viewGroup = (ViewGroup) findViewById(R.id.layoutId);
    addButton = (Button) findViewById(R.id.addButtonId);
    addButton.setOnClickListener(new AddButtonListener());
}

private class AddButtonListener implements OnClickListener {
    @Override
    public void onClick(View v) {
        // 創(chuàng)建了一個(gè)淡入效果的Animation對(duì)象
        AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);
        animation.setDuration(1000);
        animation.setStartOffset(500);
        // 創(chuàng)建一個(gè)新的ImageView
        ImageView imageViewAdd = new ImageView(MainActivity.this);
        imageViewAdd.setImageResource(R.drawable.icon);
        // 將新的ImageView添加到viewGroup當(dāng)中
        viewGroup.addView(imageViewAdd, new LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        // 啟動(dòng)動(dòng)畫(huà)
        imageViewAdd.startAnimation(animation);
    }

}

private class RemoveButtonListener implements OnClickListener {

    @Override
    public void onClick(View v) {
        // 創(chuàng)建一個(gè)淡出效果的Animation對(duì)象
        AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f);
        // 為Animation對(duì)象設(shè)置屬性
        animation.setDuration(1000);
        animation.setStartOffset(500);
        // 為Animation對(duì)象設(shè)置監(jiān)聽(tīng)器
        animation.setAnimationListener(new RemoveAnimationListener());
        imageView.startAnimation(animation);
    }
}

private class RemoveAnimationListener implements AnimationListener {
    // 該方法在淡出效果執(zhí)行結(jié)束之后被調(diào)用
    @Override
    public void onAnimationEnd(Animation animation) {
        System.out.println("end");
        // 從viewGroup當(dāng)中刪除掉imageView控件
        viewGroup.removeView(imageView);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        System.out.println("repeat");
    }

    @Override
    public void onAnimationStart(Animation animation) {
            System.out.println("start");
    }

}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咕晋,隨后出現(xiàn)的幾起案子雹拄,更是在濱河造成了極大的恐慌,老刑警劉巖掌呜,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滓玖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡质蕉,警方通過(guò)查閱死者的電腦和手機(jī)势篡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)模暗,“玉大人禁悠,你說(shuō)我怎么就攤上這事《矣睿” “怎么了碍侦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)顾孽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)比规,這世上最難降的妖魔是什么若厚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮蜒什,結(jié)果婚禮上测秸,老公的妹妹穿的比我還像新娘。我一直安慰自己灾常,他們只是感情好霎冯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钞瀑,像睡著了一般沈撞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雕什,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天缠俺,我揣著相機(jī)與錄音显晶,去河邊找鬼。 笑死壹士,一個(gè)胖子當(dāng)著我的面吹牛磷雇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躏救,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼唯笙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了盒使?” 一聲冷哼從身側(cè)響起崩掘,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忠怖,沒(méi)想到半個(gè)月后呢堰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凡泣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年枉疼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞋拟。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骂维,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贺纲,到底是詐尸還是另有隱情航闺,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布猴誊,位于F島的核電站潦刃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏懈叹。R本人自食惡果不足惜乖杠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澄成。 院中可真熱鬧胧洒,春花似錦、人聲如沸墨状。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肾砂。三九已至列赎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镐确,已是汗流浹背粥谬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工肛根, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漏策。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓派哲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掺喻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芭届,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,288評(píng)論 25 707
  • 1 背景 不能只分析源碼呀,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí)感耙,剛好有人微博私信讓全面說(shuō)說(shuō)Android的動(dòng)畫(huà)褂乍,所以今...
    未聞椛洺閱讀 2,716評(píng)論 0 10
  • 在iOS實(shí)際開(kāi)發(fā)中常用的動(dòng)畫(huà)無(wú)非是以下四種:UIView動(dòng)畫(huà),核心動(dòng)畫(huà)即硼,幀動(dòng)畫(huà)逃片,自定義轉(zhuǎn)場(chǎng)動(dòng)畫(huà)。 1.UIView...
    請(qǐng)叫我周小帥閱讀 3,112評(píng)論 1 23
  • 在想你的瞬間 目光停留 在思念的片刻 感情泛濫 炙熱的夏日 是你 在引燃著我深藏的感情 蒸騰的云煙 是你 在渲染著...
    bab87461adbd閱讀 606評(píng)論 1 14
  • 姥爺病了只酥,第一次聽(tīng)到媽媽聲音的疲憊褥实,這讓我有些惶恐。畢竟以后可能不會(huì)再有一點(diǎn)點(diǎn)期待了吧裂允。 總是以為媽媽在什么都好了...
    夏同恩閱讀 210評(píng)論 0 0