Android動畫學習筆記
標簽: 安卓
Android 動畫
補間動畫
根據不同的動畫效果,補間動畫分為4種
- 平移動畫
- 縮放動畫
- 旋轉動畫
- 透明度動畫
動畫屬性既可以在xml中設置,也可以在java代碼中寫
插值器Interpolator
簡單的來說插值器就是返回當前動畫的進度,然后根據進度設置動畫當前的效果
這是給動畫設置插值器的方法
android:interpolator="@android:anim/accelerate_interpolator"
animator.setInterpolator(new BounceInterpolator());
作用 | 資源ID | 對應Java類 |
---|---|---|
動畫加速進行 | @android:anim/accelerate_interpolator | AccelerateInterpolator |
快速完成動畫,超出再回到結束樣式 | @android:anim/overshoot_interpolator | OvershootInterpolator |
先加速再減速 | @android:anim/accelerate_decelerate_interpolator | AccelerateDecelerateInterpolator |
先退后再加速前進 | @android:anim/anticipate_interpolator | AnticipateInterpolator |
先退后再加速前進,超出終點后再回終點 | @android:anim/anticipate_overshoot_interpolator | AnticipateOvershootInterpolator |
最后階段彈球效果 | @android:anim/bounce_interpolator | BounceInterpolator |
周期運動 | @android:anim/cycle_interpolator | CycleInterpolator |
減速 | @android:anim/decelerate_interpolator | DecelerateInterpolator |
勻速 | @android:anim/linear_interpolator | LinearInterpolator |
AccelerateInterpolator插值器
public float getInterpolation(float input) {
if (mFactor == 1.0f) {
return input * input;
} else {
return (float)Math.pow(input, mDoubleFactor);
}
}
自定義插值器
自定義插值器只需要實現TimeInterpolator接口就行
public class MyInterploator implements Interpolator {
@Override
public float getInterpolation(float input) {
return 1-input;
}
}
這個插值器的就能將動畫由設置的終點向起點進行
一、平移動畫(Translate)
1.在xml中設置相關屬性
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"//動畫持續時間,必須設置
android:startOffset="1000"//動畫延遲開始時間
android:fillBefore="true"//動畫播放完畢后是否停留在動畫開始狀態默認為true
android:fillAfter="false"//動畫播放完畢后是否停留在結束狀態默認為false且優先級高于fillBefore
android:fillEnabled="true"//是否應用fillBefore值對fillAfter無影響
android:repeatMode="restart"//重復動畫模式 restart(正序) reverse(倒序) 默認為正序
android:repeatCount="0"//重復播放次數
//以上是補間動畫都有的屬性
//以下是平移動畫默認的屬性
android:fromXDelta="50%p"//視圖在水平方向x的起始值
android:toXDelta="50%"//視圖在水平方向x的結束值
android:fromYDelta="20"//豎直方向的起始值
android:toYDelta="50%"//豎直方向的終止值
>
</translate>
2.在活動中為控件關聯動畫
translate = findViewById(R.id.button1);
Animation translateAnimation = AnimationUtils.loadAnimation(this,R.anim.translate);
translate.startAnimation(translateAnimation);
3.在JAVA代碼中設置動畫
translate = findViewById(R.id.button1);
Animation translateAnimation = new TranslateAnimation(0,500,0,500);
//4個參數分別是x起始值、x終止值、y起始值、y終止值
translateAnimation.setDuration(3000);
translate.startAnimation(translateAnimation);
上面的值有三種
- xxx% 相對于自身控件的大小
- xxx%p 相對于父容器的大小
- xxx 固定大小
需要注意的是上面的起始值和終止值都是起始位置與控件原本位置的距離
二、縮放動畫(Scale)
1.在xml中設置相關屬性
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0"//動畫在水平方向的起始縮放倍數
//0零表示收縮到無
//1表示無縮放
android:toXScale="2"//水平結束倍數
android:fromYScale="1"
android:toYScale="2"
android:pivotX="50%"//縮放軸點
android:pivotY="50%"//縮放軸點 android:duration="3000"
>
</scale>
2.在活動中為控件關聯動畫
scale = findViewById(R.id.button2);
Animation scaleAnimation = AnimationUtils.loadAnimation(this,R.anim.scale);
scale.startAnimation(scaleAnimation);
3.在Java中設置動畫
scale = findViewById(R.id.button2);
Animation scaleAnimation = new ScaleAnimation(0,2,0,2,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
scaleAnimation.setDuration(3000);
//前4個參數分別為xy的起始終止zhi
// 5. pivotXType:縮放軸點的x坐標的模式
// 6. pivotXValue:縮放軸點x坐標的相對值
// 7. pivotYType:縮放軸點的y坐標的模式
// 8. pivotYValue:縮放軸點y坐標的相對值
// pivotXType = Animation.ABSOLUTE:縮放軸點的x坐標 = View左上角的原點 在x方向 加上 pivotXValue數值的點(y方向同理) +
// pivotXType = Animation.RELATIVE_TO_SELF:縮放軸點的x坐標 = View左上角的原點 在x方向 加上 自身寬度乘上pivotXValue數值的值(y方向同理)
// pivotXType = Animation.RELATIVE_TO_PARENT:縮放軸點的x坐標 = View左上角的原點 在x方向 加上 父控件寬度乘上pivotXValue數值的值 (y方向同理)
scale.startAnimation(scaleAnimation);
三、旋轉動畫
1.在xml中設置相關屬性
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"//動畫開始旋轉角度
android:toDegrees="360"//結束旋轉角度
android:pivotX="50%"//旋轉節點
android:pivotY="50%"
android:duration="3000"
>
</rotate>
2.在活動中為控件關聯動畫
rotate = findViewById(R.id.button3);
Animation rotateAnimation = AnimationUtils.loadAnimation(this,R.anim.rotate);
rotate.startAnimation(rotateAnimation);
3.在Java中設置動畫
rotate = findViewById(R.id.button3);
Animation rotateAnimation = new RotateAnimation(0,270,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
scaleAnimation.setDuration(3000);
// 1. fromDegrees :動畫開始時 視圖的旋轉角度(正數 = 順時針,負數 = 逆時針)
// 2. toDegrees :動畫結束時 視圖的旋轉角度(正數 = 順時針,負數 = 逆時針)
// 3. pivotXType:旋轉軸點的x坐標的模式
// 4. pivotXValue:旋轉軸點x坐標的相對值
// 5. pivotYType:旋轉軸點的y坐標的模式
// 6. pivotYValue:旋轉軸點y坐標的相對值
//模式值同樣分為 Animation.RELATIVE_ABSLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT
rotate.startAnimation(rotateAnimation);
四、透明度動畫
1.在xml中設置相關屬性
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"//動畫開始透明度(范圍: -1~1)
android:toAlpha="0.0"//結束透明度
android:duration="2000"
android:fillAfter="true">
</alpha>
2.在活動中為控件關聯動畫
alpha = findViewById(R.id.button4);
Animation alphaAnimation = AnimationUtils.loadAnimation(this,R.anim.rotate);
alpha.startAnimation(alphaAnimation);
3.在Java中設置動畫
alpha = findViewById(R.id.button4);
Animation alphaAnimation = new AlphaAnimation(1,0);
alphaAnimation.setDuration(3000);
alpha.startAnimation(alphaAnimation);
五、組合動畫
1.在xml中設置相關屬性
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:shareInterpolator="true"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:repeatMode="reverse"
>
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="2000"
android:fillAfter="true"
/>
<translate
android:fromXDelta="100%"
android:fromYDelta="100%"
android:toXDelta="0%"
android:toYDelta="0%"
android:duration="2000"
/>
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
/>
<scale
android:fromXScale="1"
android:toXScale="2"
android:fromYScale="1"
android:toYScale="2"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
/>
</set>
2.在活動中為控件關聯動畫
set = findViewById(R.id.button5);
Animation setAnimation = AnimationUtils.loadAnimation(this,R.anim.set);
set.startAnimation(setAnimation);
3.在Java中設置動畫
set = findViewById(R.id.button5);
Animation scaleAnimation = new ScaleAnimation(0,2,0,2,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
scaleAnimation.setDuration(3000);
Animation rotateAnimation = new RotateAnimation(0,270,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(3000);
Animation alphaAnimation = new AlphaAnimation(1,0);
alphaAnimation.setDuration(3000);
Animation translateAnimation = new TranslateAnimation(0,500,0,500);
translateAnimation.setDuration(3000);
AnimationSet setAnimation = new AnimationSet(true);
setAnimation.addAnimation(translateAnimation);
setAnimation.addAnimation(scaleAnimation);
setAnimation.addAnimation(rotateAnimation);
setAnimation.addAnimation(alphaAnimation);
set.startAnimation(setAnimation);
動畫的一部分效果圖
監聽回調
animation.setAnimationListener(new Animation.AnimayionListener(){
@Override
public void onAnimationStart(Animation animation){
}
@Override
public void onAnimationEnd(Animation animation){
}
@Override
public void onAnimationRepeat(Animation animation){
}
}
屬性動畫
ValueAnimatior
這個是屬性動畫中核心的東西
它的內部使用一種時間循環的機制來計算值與值之間的動畫過渡,我們只需要將初始值和結束值提供給ValueAnimator,并且告訴它動畫所需運行的時長,那么ValueAnimator就會自動幫我們完成從初始值平滑地過渡到結束值這樣的效果。除此之外,ValueAnimator還負責管理動畫的播放次數、播放模式、以及對動畫設置監聽器等,確實是一個非常重要的類。
下面的代碼就將0較為平滑的過度到100
ValueAnimator anim = ValueAnimator.ofInt(1, 100);
anim.setDuration(500);
anim.setStartDelay(500);
anim.setRepeatCount(0);
anim.setRepeatMode(ValueAnimator.RESTART);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int currentValue = (Integer)animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
}
});
anim.start();
ObjectAnimatior
這里如果我們想要將一個TextView在5秒中內從常規變換成全透明,再從全透明變換成常規,就可以這樣寫:
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
animator.setDuration(5000);
animator.start();
插值器TimeInterpolator 估值器TypeEvaluator
插值器就是返回當前動畫的進度,然后將進度以百分比的形式傳遞給估值器
估值器相當于一個轉換器,得到插值器給的百分比以后,將這個百分比轉換為具體的值去賦值給對象,再進行重繪
插值器決定值的變化規律,而值的具體變化交給估值器
其實ValueAnimator的過度就是以這2個為基礎的。
自定義估值器
先看一下IntEvaluator的源碼
public class IntEvaluator implements TypeEvaluator<Integer> {
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(startInt + fraction * (endValue - startInt));
}
}
自定義估值器需要實現TypeEvaluator接口&復寫evaluate.
public class MyEvaluator implements TypeEvaluator{
@Override
public Object evaluate(float fraction, Object startValue, Object endValue){
Point start = (Point) startValue;
Point end = (Point) endValue;
float x = end.getX() - start.getX();
float y = end.getY() - start.getY();
x = start.getX()+x*fraction;
y = (float) (y*Math.sin((double) fraction*Math.PI));
Point point = new Point(x,y);
return point;
}
}
public class MyAnimationView extends View {
public static final float RADIUS = 50f;
private Point currentPoint;
private Paint mPaint;
public MyAnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.BLUE);
}
@Override
protected void onDraw(Canvas canvas) {
if (currentPoint == null) {
currentPoint = new Point(RADIUS, RADIUS);
drawCircle(canvas);
} else {
drawCircle(canvas);
}
}
public void setCurrentPoint(Point point){
currentPoint = point;
invalidate();
}
private void drawCircle(Canvas canvas) {
float x = currentPoint.getX();
float y = currentPoint.getY();
canvas.drawCircle(x, y, RADIUS, mPaint);
}
}
@Override
public void onClick(View view){
switch (view.getId()){
case R.id.start:
Point start = new Point(50,50);
Point end = new Point(1500,1500);
ValueAnimator animator = ValueAnimator.ofObject(new MyEvaluator(),start,end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Point point = (Point) animation.getAnimatedValue();
myAnimationView.setCurrentPoint(point);
Log.d("dddd","pointx:"+point.getX()+" pointy:"+point.getY());
}
});
animator.setDuration(5000);
animator.start();
break;
}
}
智能推薦
Android 補間動畫學習
先上圖,看效果 我這是從大神那邊整理的,需要詳細的請移步。 補間動畫的四種: 平移動畫(Translate) 縮放動畫(scale) 旋轉動畫(rotate) 透明度動畫(alpha) 在res目錄創建一個anim目錄,把你的動畫都放在里面。 1.平移動畫(Translate) 屬性詳解 劃重點:android:duration=“3000” 動畫持續時間(ms),必須設置...
Android 動畫(五)ObjectAnimator學習
概述 ValueAnimator只能對數值做動畫計算。如果想對哪個控件操作,需要監聽動畫過程,然后在監聽中對控件操作。這樣使用起來相比補間動畫而言就相對比較麻煩。為了能讓動畫直接與對應控件相關聯,以使我們從監聽動畫過程中解放出來,谷歌的開發人員在ValueAnimator的基礎上,又派生了一個類ObjectAnimator;由于ObjectAnimator是派生自 ValueAnimator 的,...
Android屬性動畫學習二
原文鏈接 Android ObjectAnimator類學習 1.簡介 實現屬性動畫中的一個核心方法類 繼承自ValueAnimator類,即底層的動畫實現機制是基于ValueAnimator類 2.實現動畫的原理 直接對對象的屬性值進行改變操作,從而實現動畫效果 如直接改變 View的 alpha 屬性 從而實現透明度的動畫效果 3.基礎使用 透明度 效果 旋轉 更改init()代碼: 還有平移...
Android屬性動畫學習一
原文鏈接 對于屬性動畫的使用,主要有: 兩個使用方法類:ValueAnimator 類 & ObjectAnimator 類 兩個輔助使用類:插值器 & 估值器 ValueAnimator類的學習 ValueAnimator類中有3個重要方法: ValueAnimator.ofInt(int... values) ValueAnimator.ofFloat(float... val...
Android動畫學習總結(一)
Android動畫主要有三種:view動畫,幀動畫,屬性動畫。 1.view動畫:也叫補間動畫,通過對場景的對象不斷做圖像變換(平移,縮放,旋轉,透明度)從而產生動畫效果,是一種漸進式動畫。 四種動畫效果對應四種子類: 動畫效果 標簽 java類 平移動畫 <translate> TranslateAnimation 縮放動畫 <scale...
猜你喜歡
Android轉場動畫的學習
本文轉自:http://www.jianshu.com/p/e63090e06c3e# 最近在UI中國看見一個很好看的效果,它是這樣的: yuansu2.gif 鏈接地址:http://www.ui.cn/detail/237678.html 然后我上網搜了一下,發現Android5.0以上版本,在Activity切換時是有提供動畫的。 所以這篇文章會簡單的介紹一下Android的幾種轉場動畫,才...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...