android位置動畫
❶ android 如何做移動的動畫呢 謝謝大家~~
TranslateAnimation 繼承自 android.view.animation.Animation,可以通過image.setAnimation(animation);來設置AnimationDrawable繼承自android.graphics.drawable.Drawable, 可以通過image.setBackgroundDrawable(drawable);
❷ android 設置dialog大小、位置、動畫
dialogAnim
scale_in.xml
scale_out.xml
❸ Android 繪制折線並移動動畫效果
AnimationRunnable
nowIndex 現在要繪制的終點位置角標
remainder 取的角標余數
說這么多我們看來看log日誌,根據這個日誌我們可以看到remainder 這個值 就是兩點之間的比例
nowIndex 就是我們當前終點角標
接下來我們畫線的時候 使用到這些參數來完成動畫效果,這里我們可以看到 nowIndex 繪制線的數量,通過判斷 只有最後一條的時候要根據取到的余數 繼續後面的繪制,noew跟數據的長度一樣,最後這里就不需要繪制了。
我們可以看到 取到兩點的x,y距離
然後根據remainder 計算出我現在應該處於的位置,在原有的x,y基礎上+計算出的x,y 距離
MoveTheLineChart
AbsChart主要繪制一些公用部分
ChartUtil
Activity 調用
Xml 布局
❹ Android 中的動畫有哪幾類,它們的特點和區別是什麼
Android 中的動畫有三類,它們的特點和區別如下:
###幀動畫
> 一張張圖片不斷的切換,形成動畫效果
* 在drawable目錄下定義xml文件,子節點為animation-list,在這里定義要顯示的圖片和每張圖片的顯示時長
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/g1" android:ration="200" />
<item android:drawable="@drawable/g2" android:ration="200" />
<item android:drawable="@drawable/g3" android:ration="200" />
</animation-list>
* 在屏幕上播放幀動畫
ImageView iv = (ImageView) findViewById(R.id.iv);
//把動畫文件設置為imageView的背景
iv.setBackgroundResource(R.drawable.animations);
AnimationDrawable ad = (AnimationDrawable) iv.getBackground();
//播放動畫
ad.start();
###補間動畫
* 原形態變成新形態時為了過渡變形過程,生成的動畫就叫補間動畫
* 位移、旋轉、縮放、透明
#####位移:
* 參數10指的是X的起點坐標,但不是指屏幕x坐標為10的位置,而是imageview的 真實X + 10
* 參數150指的是X的終點坐標,它的值是imageview的 真實X + 150
//創建為位移動畫對象,設置動畫的初始位置和結束位置
TranslateAnimation ta = new TranslateAnimation(10, 150, 20, 140);
* x坐標的起點位置,如果相對於自己,傳0.5f,那麼起點坐標就是 真實X + 0.5 * iv寬度
* x坐標的終點位置,如果傳入2,那麼終點坐標就是 真實X + 2 * iv的寬度
* y坐標的起點位置,如果傳入0.5f,那麼起點坐標就是 真實Y + 0.5 * iv高度
* y坐標的終點位置,如果傳入2,那麼終點坐標就是 真實Y + 2 * iv高度
TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2)
* 動畫播放相關的設置
//設置動畫持續時間
ta.setDuration(2000);
//動畫重復播放的次數
ta.setRepeatCount(1);
//動畫重復播放的模式
ta.setRepeatMode(Animation.REVERSE);
//動畫播放完畢後,組件停留在動畫結束的位置上
ta.setFillAfter(true);
//播放動畫
iv.startAnimation(ta);
#####縮放:
* 參數0.1f表示動畫的起始寬度是真實寬度的0.1倍
* 參數4表示動畫的結束寬度是真實寬度的4倍
* 縮放的中心點在iv左上角
ScaleAnimation sa = new ScaleAnimation(0.1f, 4, 0.1f, 4);
* 參數0.1f和4意義與上面相同
* 改變縮放的中心點:傳入的兩個0.5f,類型都是相對於自己,這兩個參數改變了縮放的中心點
* 中心點x坐標 = 真實X + 0.5 * iv寬度
* 中心點Y坐標 = 真實Y + 0.5 * iv高度
ScaleAnimation sa = new ScaleAnimation(0.1f, 4, 0.1f, 4, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
#####透明:
* 0為完全透明,1為完全不透明
AlphaAnimation aa = new AlphaAnimation(0, 0.5f);
#####旋轉:
* 20表示動畫開始時的iv的角度
* 360表示動畫結束時iv的角度
* 默認旋轉的圓心在iv左上角
RotateAnimation ra = new RotateAnimation(20, 360);
* 20,360的意義和上面一樣
* 指定圓心坐標,相對於自己,值傳入0.5,那麼圓心的x坐標:真實X + iv寬度 * 0.5
* 圓心的Y坐標:真實Y + iv高度 * 0.5
RotateAnimation ra = new RotateAnimation(20, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
#####所有動畫一起飛
//創建動畫集合
AnimationSet set = new AnimationSet(false);
//往集合中添加動畫
set.addAnimation(aa);
set.addAnimation(sa);
set.addAnimation(ra);
iv.startAnimation(set);
---
#屬性動畫
* 補間動畫,只是一個動畫效果,組件其實還在原來的位置上,xy沒有改變
###位移:
* 第一個參數target指定要顯示動畫的組件
* 第二個參數propertyName指定要改變組件的哪個屬性
* 第三個參數values是可變參數,就是賦予屬性的新的值
* 傳入0,代表x起始坐標:當前x + 0
* 傳入100,代表x終點坐標:當前x + 100
//具有get、set方法的成員變數就稱為屬性
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 100) ;
###縮放:
* 第三個參數指定縮放的比例
* 0.1是從原本高度的十分之一開始
* 2是到原本高度的2倍結束
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "scaleY", 0.1f, 2);
###透明:
* 透明度,0是完全透明,1是完全不透明
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "alpha", 0.1f, 1);
###旋轉
* rotation指定是順時針旋轉
* 20是起始角度
* 270是結束角度
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "rotation", 20, 270);
* 屬性指定為rotationX是豎直翻轉
* 屬性指定為rotationY是水平翻轉
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "rotationY", 20, 180);
###可變參數
* 第三個參數可變參數可以傳入多個參數,可以實現往回位移(旋轉、縮放、透明)
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 70, 30, 100) ;
❺ android屬性動畫詳解
在 Android 動畫中,總共有兩種類型的動畫View Animation(視圖動畫)和Property Animator(屬性動畫);其中
View Animation包括Tween Animation(補間動畫)和Frame Animation(逐幀動畫);
Property Animator包括ValueAnimator和ObjectAnimation;
首先,直觀上,他們有如下三點不同:
1、引入時間不同: View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才開始有Property Animation相關的API。
2、所在包名不同: View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
3、動畫類的命名不同: View Animation中動畫類取名都叫XXXXAnimation,而在Property Animator中動畫類的取名則叫XXXXAnimator大家都知道逐幀動畫主要是用來實現動畫的,而補間動畫才能實現控制項的漸入漸出、移動、旋轉和縮放的;而Property Animator是在Android 3.0版本才引入的,之前是沒有的。
為什麼還要引入Property Animator呢?
1、為什麼引入Property Animator(屬性動畫)
我提出一個假設:請問大家,如何利用補間動畫來將一個控制項的背景色在一分鍾內從綠色變為紅色?這個效果想必沒辦法僅僅通過改變控制項的漸入漸出、移動、旋轉和縮放來實現吧,而這個效果是可以通過Property Animator完美實現的
**這就是第一個原因:Property Animator能實現補間動畫無法實現的功能 **大家都知道,補間動畫和逐幀動畫統稱為View Animation,也就是說這兩個動畫只能對派生自View的控制項實例起作用;而Property Animator則不同,從名字中可以看出屬性動畫,應該是作用於控制項屬性的!正因為屬性動畫能夠只針對控制項的某一個屬性來做動畫,所以也就造就了他能單獨改變控制項的某一個屬性的值!比如顏色!這就是Property Animator能實現補間動畫無法實現的功能的最重要原因。
**我們得到了第二點不同:View Animation僅能對指定的控制項做動畫,而Property Animator是通過改變控制項某一屬性值來做動畫的。
**假設我們將一個按鈕從左上角利用補間動畫將其移動到右下角,在移動過程中和移動後,這個按鈕都是不會響應點擊事件的。這是為什麼呢?因為補間動畫僅僅轉變的是控制項的顯示位置而已,並沒有改變控制項本身的值。View Animation的動畫實現是通過其Parent View實現的,在View被drawn時Parents View改變它的繪制參數,這樣雖然View的大小或旋轉角度等改變了,但View的實際屬性沒變,所以有效區域還是應用動畫之前的區域;我們看到的效果僅僅是系統作用在按鈕上的顯示效果,利用動畫把按鈕從原來的位置移到了右下角,但按鈕內部的任何值是沒有變化的,所以按鈕所捕捉的點擊區域仍是原來的點擊區域。(下面會舉例來說明這個問題)
這就得到了第三點不同:補間動畫雖能對控制項做動畫,但並沒有改變控制項內部的屬性值。而Property Animator則是恰恰相反,Property Animator是通過改變控制項內部的屬性值來達到動畫效果的
我們前面講了Property Animator包括ValueAnimator和ObjectAnimator;這篇文章就主要來看看ValueAnimator的使用方法吧。
我覺得谷歌那幫老頭是最會起名字的人,單從命名上,就能看出來這個東東的含義。ValueAnimator從名字可以看出,這個Animation是針對值的! ValueAnimator不會對控制項做任何操作,我們可以給它設定從哪個值運動到哪個值,通過監聽這些值的漸變過程來自己操作控制項。 它會自己計算動畫的過程,然後我們需要監聽它的動畫過程來自己操作控制項。
這就是ValueAnimator的功能:ValueAnimator對指定值區間做動畫運算,我們通過對運算過程做監聽來自己操作控制項。
總而言之就是兩點:
1. ValueAnimator只負責對指定的數字區間進行動畫運算
2. 我們需要對運算過程進行監聽,然後自己對控制項做動畫操作
插值器的意義其實就相當於物理公式中的加速度參數,所以這也就是它也叫加速器的原因。 如何自定義插值器:
**input參數與任何我們設定的值沒關系,只與時間有關,隨著時間的增長,動畫的進度也自然的增加,input參數就代表了當前動畫的進度。而返回值則表示動畫的當前數值進度 **
在getInterpolation函數中,我們將進度反轉過來,當傳0的時候,我們讓它數值進度在完成的位置,當完成的時候,我們讓它在開始的位置
ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用。ObjectAnimator重寫了幾個方法,比如ofInt(),ofFloat()等。利用ObjectAnimator重寫的ofFloat方法如何實現一個動畫:(改變透明度)
前面我們都是定義多個值,即至少兩個值之間的變化,那如果我們只定義一個值呢,如下面的方式:(同樣以MyPointView為例)
僅且僅當我們只給動畫設置一個值時,程序才會調用屬性對應的get函數來得到動畫初始值。如果動畫沒有初始值,那麼就會使用系統默認值。比如ofInt()中使用的參數類型是int類型的,而系統的Int值的默認值是0,所以動畫就會從0運動到100;也就是系統雖然在找到不到屬性對應的get函數時,會給出警告,但同時會用系統默認值做為動畫初始值。
如果通過給自定義控制項MyPointView設置了get函數,那麼將會以get函數的返回值做為初始值。
根據 View setBackGroundColor() 方法可以自定義條用屬性動畫。
❻ Android實現View平移動畫的方式
平移動畫,大概是我們最容易想到的實現方式,但並非能滿足所有需求。這種方式不能控制進度,設置好動畫持續時間後,就會一直到結束。
通過drawBitmap在不同的位置畫出圖片,適合圖片作為平移動畫的需求。經測試,使用Matrix方式對部分待透明度以及過大的圖片無法繪制,通過計算位置直接繪制正常。
改變長度和改變位置是一個道理。獲取View的位置,然後通過進度計算出View的寬度,再通過setLayoutParams改變View大小。這個方式滿足我們的需求,採用的此方式。
以上。如有錯誤,歡迎指正!
個人簡介:
❼ 吐血總結【Android動畫】必知必會
通過AnimationListener可以監聽Animation的運行過程,有三個方法分別是Animation開始的時候調用,完成的時候調用,重復的時候調用。
AnimationSet,動畫集合。 我們最常用的是調用其 addAnimation 將一個個不一樣的動畫組織到一起來,然後調用view 的 startAnimation 方法觸發這些動畫執行。
setAnimation是告訴該控制項我待會要執行什麼動畫,而要執行的的動畫,是需要手動添加的。並且需要父view在動畫快要開啟的時候,調用invalidate。需要一定的條件限制。
而startAnimation告訴該控制項,我要立馬執行該動畫,該動畫就是已經設置好的動畫。調用它時就會立即開始動畫。
參看這篇文章: Android動畫之Interpolator插補器和TypeEvaluator估值器
Property Animation提供了Animator.AnimatorListener和Animator.AnimatorUpdateListener兩個監聽器用於動畫在播放過程中的重要動畫事件。下面是兩個監聽器介面和方法的一些介紹和說明:
上面講到ViewAnimation有許多xml載入,當然PropertyAnimation也可以對應xml載入,位置為 res/animator/
animator.xml
調用就用到了AnimatorInflater類了
組合動畫也可以xml載入
在 Android 3.0 中給 View 增加了一些新的屬性以及相應的 getter、setter 方法。Property Animation系統可以通過修改 View 對象實際的屬性值來實現屏幕上的動畫效果。此外,當屬性值發生變化時,Views 也會自動調用 invalidate() 方法來刷新屏幕。 View 類中新增的便於實現 property 動畫的屬性包括:
1 . 第一個參數:設置目標對象,即操縱的view
2 . 第二個參數:設置操作的動畫的屬性值(見上面講解的動畫屬性值)
3 . 第三個參數:可變數組參數 (初始值,中間值,結束值)。可以有一個到N個,如果是一個值的話默認這個值是動畫過渡值的結束值。如果有N個值,動畫就在這N個值之間過渡。
針對同一個對象多個屬性,同時作用多種動畫
可以調用其playTogether(同時執行)、playSequentially(順序執行)、play、before、with、after 等方法設置動畫的執行順序,然後調用其start 觸發動畫執行。
Android 3.0後,谷歌給View增加animate方法直接驅動屬性動畫。
❽ Android 動畫詳解
android中酷炫的效果,都離不開動畫的支持。這里我們詳細介紹一下android中動畫的分類。android的中動畫分為幀動畫、補間動畫、屬性動畫。原理各不相同,實現的效果也大不相同。下面一一講解三種動畫。
幀動畫顧名思義就是通過順序一幀一幀播放圖片從而產生動畫效果,效果類似放電影。該動畫缺點比較明顯,就是如果圖片過大過多會導致OOM。幀動畫xml文件放置在drawable目錄下而非anim文件夾下。
補間動畫是通過對view進行旋轉、縮放、漸變、透明度變化,而達到的一種動畫效果。是一種漸進式動畫。並且可以通過組合以上四種操作,完成復雜的自定義動畫效果。缺點就是只是改變的view的展示狀態,但是不會改變view的位置。例如我們將一個button通過位移想左移動100dp,然後停留在終點。但是我們可以發現展示的位置button點擊無效果,不可以交互。而在button原始位置空白的地方點擊會觸發button的點擊效果。也就是button本質還是在原來位置,只是展示左移了100dp。
透明度動畫,通過改變view的透明度展示動畫。對應AlphaAnimation和<alpha>xml標簽
縮放動畫,通過修改view的大小展示動畫。對應ScaleAnimation類和<scale>xml表情
通過旋轉view展示動畫。對應RotateAnimation類和<rotate>xml標簽
平移動畫,更改view的展示位置展示動畫。對應TranslateAnimation類和<translate>xml表情
應用動畫xml配置
使用java類配置動畫,具體參數類同xml參數,建議使用xml配置動畫
屬性動畫本質是通過改變對象的屬性(例如:x,y等屬性),來實現動畫的,所以基本上是無所不能的,只要對象有這個屬性,就能實現動畫效果。屬性動畫是在api11的新特性,通過動態的改變view的屬性從而達到動畫效果。雖然可以使用nineoldandroid庫向下兼容,但是兼容本質是使用補間動畫完成,也就是說不會更改view的屬性,也不會更改view的位置。屬性動畫比較常用的類: ValueAnimator、ObjectAnimator、AnimationSet,其中ObjectAnimator是ValueAnimator的子類,而AnminationSet是動畫集合
動畫配置同樣可以使用xml配置,參數類似,這里不做詳細說明。
根據時間流逝百分比計算當前屬性改變百分比。同xml配置動畫中的 android:interpolator 屬性配置,常見有LinearInterpolator(線性差值器)、(加速減速差值器)
等。自定義需要實現 Interpolator 或者 TimeInterpolator 。Interpolator介面繼承TimeInterpolator。
根據當前屬性改變百分比計算改變後的屬性值。屬性動畫特有的屬性。自定義估值器需要實現 TypeEvaluator 介面。
可以對任意屬性做屬性動畫,屬性動畫要求動畫作用的對象提供該屬性的get()和set()方法。因為屬性動畫本質就是根據外界傳遞的對象屬性的初始值和終點值,然後根據估值器和差值器計算屬性值,不斷調用屬性的set方法,通過時間的推移所傳遞的值,越來越近終點值。
注意:
使用ValueAnimator通過監聽動畫過程,自己改變對象屬性完成動畫
❾ android 怎麼實現沿控制項方向做位移動畫
在Android開發,我們會經常使用到位移動畫,一般情況下位移動畫有兩種實現方式,一種是直接通過Java代碼去實現,另外一種是通過配置文件實現動畫,下面是兩種動畫的基本是使用方法:
純Java代碼實現:
[java] view plain
//創建漸變動畫
Animation animation = new TranslateAnimation(0, 0, 300, 300);
animation.setDuration(1500);
animation.setRepeatCount(1);//動畫的重復次數
animation.setFillAfter(true);//設置為true,動畫轉化結束後被應用
imageView1.startAnimation(animation);//開始動畫
通過配置文件實現:
1、首先要在res目錄下建立一個anim文件,在anim建立一個alpha1.xml文件如下:
[java] view plain
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:ration="1500"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="200"
android:toYDelta="300"
android:repeatCount="3"
android:interpolator="@android:anim/cycle_interpolator"
android:repeatMode="reverse"
/>
</set>
2、載入動畫
[java] view plain
Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
imageView1.startAnimation(animation);//開始動畫
案例下載地址:http://download.csdn.net/detail/u013043346/9374204
❿ 【Android 動畫】動畫詳解之補間動畫(一)
之前很早就想寫寫Android 的動畫,最近剛好有時間,大概聊一聊安卓動畫。
個人習慣將動畫分為:補間動畫(透明度、旋轉、位移、縮放)、幀動畫、和屬性動畫,這一篇,我們先說說補間動畫。
補間動畫這個詞出於flash,在兩個關鍵幀( 可以理解成動畫開始和結束 )中間需要做「補間動畫」,才能實現圖畫的運動;插入補間動畫後兩個關鍵幀之間的插補幀是由計算機自動運算而得到的。
實際上,Android 的補間動畫也是由我們指定動畫開始、動畫結束2個關鍵點,中間部分的動畫由系統完成
在正式開始之前,我們先說下Android 系統的坐標系,屏幕左上角為坐標原點,假如屏幕為1080*1980,那麼左上角為(0,0),右上角為(1080,0),左下角為(0,1980),右下角為(1080,1980)
所有動畫有以下公共屬性,注釋比較詳細,這里就不在詳述了
ScaleAnimation有3種構造方法
我們先看第一種,其起始比例為0,縮放比例為1.4,即放大到1.4倍
效果如下:
第二種,pivotx,pivotY分別代表起始位置的x、y方向的坐標,我們設置為(100,100)
效果如下:
第三種,pivotXType和pivotYType有2種模式,RELATIVE_TO_SELF(相對於自身)和RELATIVE_TO_PARENT(相對於父布局),如果設置這個,pivotx,pivotY的值就應該是0-1的浮點數,這里分別對應xml中的%(自身)和%p(父布局)
TranslateAnimation有2種構造方法,和ScaleAnimation類似
效果如下:
效果如下:
RELATIVE_TO_PARENT
效果如下:
RotateAnimation有3種構造方法
順時針720度
效果如下:
逆時針720度
效果如下:
效果如下:
再來RELATIVE_TO_PARENT
效果如下:
這是什麼鬼???怎麼跑到屏幕外面去了?
原來設置為RELATIVE_TO_PARENT時,旋轉中心x方向應該為該空間離左邊的邊距+父布局寬度/2,y方向同理,而此時,我們布局中紅色的Textview為居中狀態,所以旋轉中心為屏幕右下角。讓我們來看個例子
修改布局如下:
效果如下:
這時,我們看到旋轉中心x方向為離左邊100dp處
AlphaAnimation只有1種構造方法
其中fromAlpha為動畫開始的透明度;toAlpha為動畫結束的透明度
效果如下:
效果如下:
AnimationSet是一個動畫的集合,可以按照添加的順序播放動畫,讓我們來看個例子,通過組合動畫,實現旋轉漸入動畫
效果如下:
到這里,補間動畫就介紹完了
參考資料: 自定義控制項三部曲之動畫篇