⑴ android 自定義view之懸浮動畫
第五步:
githup地址: https://github.com/xuehuixzh/Floating-animation.git
⑵ android自定義view不隨系統顯示設置變大
設置屬性動畫改變scaleX和scaleY值。
變大變小可以用view、setScaleX和setScaleY,使用前分別設置軸心(setPivotX)。要動畫而不是直接突然變大的話用屬性動畫,屬性動畫改變scaleX和scaleY值。
補間動畫在這里不好用,不需要動畫的話,這里可以用把其他View都gone掉更好,用線性布局和weight去1/4平分空間,gone掉別的view的時候這個就自然變大占滿了或者應該播放時上面蒙層一個View專門處理播放。
⑶ Android動畫之ViewPropertyAnimator(專用於view的屬性動畫)
屬性動畫對比原來的視圖動畫有很多的優點,屬性動畫可以對所有的對象做動畫操作,但Android開發中需要做動畫最多的還是View,如果只是對一個view做動畫,很少的幾個屬性還行,如果是對同一個view的十幾個屬性同時做動畫,相信屬性動畫的寫法是比較繁瑣的。ViewPropertyAnimator從名字就可以看出是專用於View的屬性動畫,在API12被提供。ViewPropertyAnimator專用於操作View動畫,語法更加簡潔,使用更加方便。
developer: https://developer.android.google.cn/reference/android/view/ViewPropertyAnimator
如何獲取ViewPropertyAnimator 對象:
ViewPropertyAnimator 沒有構造函數,通過View.animate()方法可以方便的獲取ViewPropertyAnimator 對象,此時獲取的動畫對象就專用於操作當前view。
setDuration(); //設置動畫時長
setInterpolator(); //設置插值器
setStartDelay(); //設置延遲開始時間
start(); //立刻開始動畫
cancel(); //取消動畫
明顯看到圖片先往下走了一段,然後向左的動畫才開始執行。
鏈式操作
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).translationY(300).scaleX(0.5f);
以上函數的執行,會導致相同動畫的cancle,以上函數都是除了坐標相關都是以view左上角為坐標原點。
方法都比較簡單,下面距幾個列子:
首先利用translationX,translationXBy來區分By的意義:
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationY(300);
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationYBy(300);
translationYBy 可以多次移動View,translationY多次執行沒有效果。
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).x(100).y(100);
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).rotation(270);
據觀察withEndAction相當於動畫開始,withStartAction相當於動畫結束。
可以看到可以添加setUpdateListener監聽,但無法通過這個監聽函數監聽到當前動畫的信息,所以這個監聽函數可能用處不大。
Animation動畫概述和執行原理
Android動畫之補間動畫TweenAnimation
Android動畫之逐幀動畫FrameAnimation
Android動畫之插值器簡介和系統默認插值器
Android動畫之插值器Interpolator自定義
Android動畫之視圖動畫的缺點和屬性動畫的引入
Android動畫之ValueAnimator用法和自定義估值器
Android動畫之ObjectAnimator實現補間動畫和ObjectAnimator自定義屬性
Android動畫之ObjectAnimator中ofXX函數全解析-自定義Property,TypeConverter,TypeEvaluator
Android動畫之AnimatorSet聯合動畫用法
Android動畫之LayoutTransition布局動畫
Android動畫之共享元素動畫
Android動畫之ViewPropertyAnimator(專用於view的屬性動畫)
Android動畫之Activity切換動畫overridePendingTransition實現和Theme Xml方式實現
Android動畫之ActivityOptionsCompat概述
Android動畫之場景變換Transition動畫的使用
Android動畫之Transition和TransitionManager使用
Android動畫之圓形揭露動畫Circular Reveal
Android 動畫之 LayoutAnimation 動畫
Android動畫之視圖動畫的缺點和屬性動畫的引入
⑷ android 自定義view中怎麼設置view放縮動畫
有時候需要點擊一個view可以動畫展開和收縮折疊一個View這樣的效果,這樣就可以直接自定義View來實現。
本例中,採用繼承FrameLayout來實現自定義的ExpandView。下面將詳細介紹各個部分來實現該類以及如何使用該自定義視圖。
⑸ android 自定義view怎麼實現動畫
可以直接newView來得到View對象來實現代碼布局。以下為示例代碼:1.絕對布局AbsoluteLayoutabslayout=newAbsoluteLayout(this);setContentView(abslayout);Buttonbtn1=newButton(this);btn1.setText(」thisisabutton」);btn1.setId(1);AbsoluteLayout.LayoutParamslp1=newAbsoluteLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,0,100);abslayout.addView(btn1,lp1);2.相對布局RelativeLayoutrelativeLayout=newRelativeLayout(this);setContentView(relativeLayout);AbsoluteLayoutabslayout=newAbsoluteLayout(this);RelativeLayout.LayoutParamslp1=newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);lp1.addRule(RelativeLayout.ALIGN_PARENT_TOP);lp1.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);relativeLayout.addView(abslayout,lp1);3.線性布局LinearLayoutll=newLinearLayout(this);EditTextet=newEditText();ll.addView(et);//動態添加布局的方法1.LinearLayoutll=(LinearLayout)this.getLayoutInflater().inflate(R.layout.main1,null);setContentView(ll);LinearLayoutll2=(LinearLayout)this.getLayoutInflater().inflate(R.layout.main2,ll);//這樣main2作為main1的子布局加到了main1的根節點下//動態添加布局的方法2addView.LinearLayoutll=(LinearLayout)this.getLayoutInflater().inflate(R.layout.main1,null);setContentView(ll);LinearLayoutll2=(LinearLayout)this.getLayoutInflater().inflate(R.layout.main2,null);ll.addView(ll2);
⑹ android裡面的WindowManager如何給view添加自定義動畫
懸浮窗口就是popuwindow. activity也可以通過theme設置成懸浮形式,就像dialog
⑺ android 自定義view怎麼做能提高效率
越少越好
為了加速視圖,從那些調用頻繁的活動中減少不必要的代碼。在OnDraw()方法中開始繪制,它會給你最大的
效益。特別低,你也應該減少在onDraw()方法中的內存分配,因為任何內存分配都可能導致內存回收,這將會
引起不連貫。 在初始化或者動畫之間分配對象。絕不要在動畫運行時分配內存。
另一方面需要減少onDraw()方法中的開銷,只在需要時才調用onDraw()方法。通常invalidate()方法會調用
onDraw()方法,因此減少對invalidate()的不必要調用。如果可能,調用它的重載版本即帶有參數的invalidate()
方法而不是無參的invalidate()方法。該帶參數的方法invalidate()能使draw過程更有效,以及減少對落在該矩形
區域(參數指定的區域)外視圖的不必要重繪 。
⑻ Android自定義View——從零開始實現書籍翻頁效果(一)
前言 :本篇是系列博客的第三篇,這次我們要研究 書籍翻頁效果 。不知道大家平時有沒用過iReader、掌閱這些小說軟體,裡面的翻頁效果感覺十分的酷炫。有心想研究研究如何實現,於是網上找了找,發現這方面的教學資料非常少,所幸能找到 何明桂大大 的 Android 實現書籍翻頁效果----原理篇 這樣的入門博客(感謝大大 Orz),我們就以這篇博客為切入點從零實現我們自己的翻頁效果。由於這次坑比較深,預計會寫好幾期,感興趣的小夥伴可以點下關注以便及時收到更新提醒,謝謝大家的支持 ~
本篇只著重於思路和實現步驟,裡面用到的一些知識原理不會非常細地拿來講,如果有不清楚的api或方法可以在網上搜下相應的資料,肯定有大神講得非常清楚的,我這就不獻丑了。本著認真負責的精神我會把相關知識的博文鏈接也貼出來(其實就是懶不想寫那麼多哈哈),大家可以自行傳送。為了照顧第一次閱讀系列博客的小夥伴,本篇會出現一些在之前 系列博客 就講過的內容,看過的童鞋自行跳過該段即可
國際慣例,先上效果圖,本次主要實現了 基本的上下翻頁效果 與 右側最大翻頁距離的限制
在看這篇博客之前,希望大家能先了解一下書籍翻頁的實現原理,博客鏈接我已經貼出來了。通過原理講解我們知道,整個書籍翻頁效果界面分成了三個區域, A 為當前頁區域, B 為下一頁區域, C 為當前頁背面,如圖所示
書籍翻頁效果的實現就是要以我們 觸摸屏幕位置的坐標 為基礎繪制出這三個區域,形成模擬翻頁的特效。要繪制這三個區域,我們需要通過一組 特定的點 來完成,這些點的坐標需要通過兩個已知的點( 觸摸點 、 相對邊緣角 )計算得到,下圖我將各個特定點的位置和計算公式貼出來,大家對照著原理一起理解(渣畫工望體諒 ╮(╯▽╰)╭ ),其中 b 點是由 ae 和 cj 的交點, k 點是由 ah 和 cj 的交點
簡單總結一下, a 是觸摸點, f 是觸摸點相對的邊緣角, eh 我們設置為 af 的垂直平分線,則 g 是 af 的中點, ab 、 ak 、 dj 是 直線 ; 曲線cdb 是起點為 c ,控制點為 e ,終點為 b 的 二階貝塞爾曲線 ; 曲線kij 是起點為 k ,控制點為 h ,終點為 j 的 二階貝塞爾曲線 ,區域 A 、 B 、 C 就由這些點和線劃分開來。我們將這些點稱為標識點,下一步就是模擬設定 a 和 f 點的位置,將這組標識點繪制到屏幕上來驗證我們的計算公式是否正確,創建 BookPageView
實體類 MyPoint 用來存放我們的標識點坐標
界面布局:
在Activity中進行注冊
效果如圖
前文我們提到 ab 、 ak 、 dj 是 直線 ; 曲線cdb 是起點為 c ,控制點為 e ,終點為 b 的 二階貝塞爾曲線 ; 曲線kij 是起點為 k ,控制點為 h ,終點為 j 的 二階貝塞爾曲線 。通過觀察分析得知, 區域A 是由View 左上角 , 左下角 , 曲線cdb , 直線 ab 、 ak , 曲線kij , 右上角 連接而成的區域,修改 BookPageView ,利用 path 繪制處 區域A
效果如圖
區域C 理論上應該是由點 a , b , d , i , k 連接而成的閉合區域,但由於 d 和 i 是曲線上的點,我們沒辦法直接從 d 出發通過 path 繪制路徑連接 b 點( i , k 同理),也就不能只用 path 的情況下直接繪制出 區域C ,我們需要用 PorterDuffXfermode 方面的知識「曲線救國」。我們試著先將點 a , b , d , i , k 連接起來,觀察閉合區域與 區域A 之間的聯系。修改 BookPageView
效果如圖
我們將兩條曲線也畫出來對比觀察
觀察分析後可以得出結論, 區域C 是 由直線ab,bd,dj,ik,ak連接而成的區域 減去 與區域A交集部分 後剩餘的區域。於是我們設置 區域C 畫筆 Xfermode 模式為 DST_ATOP
效果如圖
最後是 區域B ,因為 區域B 處於最底層,我們直接將 區域B 畫筆 Xfermode 模式設為 DST_ATOP ,在 區域A、C 之後繪制即可,修改 BookPageView
效果如圖
翻頁可以從右下方翻自然也可以從右上方翻,我們將 f 點設在右上角,由於View上下兩部分是呈 鏡像 的,所以各標識點的位置也應該是鏡像對應的,因為 區域B和C 的繪制與 f 點沒有關系,所以我們只需要修改 區域A 的繪制邏輯,新增 getPathAFromTopRight() 方法
效果如圖
之前由於測試效果沒有對View的大小進行重新測量,在實現觸摸翻頁之前先把這個結了。重寫View的 onMeasure() 方法
我們的需求是,在上半部分翻頁時 f 點在右上角,在下半部分翻頁時 f 則在右下角,當手指離開屏幕時回到 初始狀態 ,根據需求,修改 BookPageView
在Activity中監聽View的 onTouch 狀態
注意,要設置 android:clickable 為 true ,否則無法監聽到 ACTION_MOVE 和 ACTION_UP 狀態
效果如圖
到這里我們已經實現了基本的翻頁效果,但要還原真實的書籍翻頁效果,我們還需要設置一些限制條件來完善我們的項目
對於一般的書本來說,最左側應該是釘起來的,也就是說如果我們從右側翻頁,翻動的距離是 有限制的 ,最下方翻頁形成的曲線起點( c 點)的x坐標不能小於0(上方同理),按照這個限定條件,修改我們的 BookPageView
效果如圖
至此本篇教程就告一段落了,當然還有許多功能需要繼續完善,例如橫向翻頁、翻頁動畫、陰影效果等等,這些都會在後面的教程中一一解決。如果大家看了感覺還不錯麻煩點個贊,你們的支持是我最大的動力~
⑼ Android自定義View(9) 《動畫 插值器簡介》
在Android中,我們經常會需要去繪制一些自己需要的控制項,所以繼承自View的自定義View就產生了。這篇文章主要介紹動畫中的一些常用的插值器。關於插值器的使用這里就不再敘述了,有需要可以查看 Android自定義View(5) 《自定義View,動畫篇 視圖動畫》 。
加速減速插值器,剛開始和結束的時候速度會比較慢,中間會加速
加速插值器,速度越來越快
減速插值器動畫開始的時候速度加速到最大值,接著越來越慢
線性插值器,速率保持恆定
彈性插值器,模擬了控制項來回彈跳的樣子『
初始偏移插值器,會在動畫開始的時候先向前偏移然後再開始動畫
結束偏移插值器,表示在結束時沿動畫方向繼續運動一段距離再結束動畫
開始和結束均偏移,是AnticipateInterpolator和OvershootInterpolator的合體。
循環插值器,其構造函數
其實系統的插值器使用都是比較簡單的,那麼我們如何來自定義一個屬於自己的插值器呢?首先我們來看一下LinearInterpolator的源碼
在這里我們要注意有這個方法
這就是我們自定義插值器的關鍵了,我們需要實現Interpolator介面,並復寫上述方法。該方法的input就是動畫的執行進度,范圍是0~1,根據動畫的執行時間勻速輸出,我們通過這個值來計算出動畫實際的動畫值,這個概念看過 Android自定義View(6) 《自定義View,動畫篇 屬性動畫 ValueAnimator》 就可以理解了。線性插值器在這個方法中輸出了input,也就是未做任何處理直接輸出了,所以動畫也就按0~1的進度勻速執行了。
接下來我們開始定義一個屬於自己的簡單的插值器,我們來直接實現動畫的倒序播放
內容很簡單,就是將原本0至1的輸出結果,變為1至0,也就是倒序播放
接下來我們用之前的縮放例子來測試一下我們的插值器
這里我們可以看到我們原本設置的是從1縮放到0.5,實際的運行結果卻是從0.5開始放大到1,所以使用了我們的插值器後成功實現了倒放,自定義的插值器成功了~
視圖動畫僅支持插值器的使用,但是這里我們再介紹一個Animator特有的Evaluator的用法,剛剛我們說了,自定義插值器其實就是將動畫的進度在指定的時長內分成了0到1,用來表示動畫執行的進度。在介紹Evaluator之前呢,我們再來看之前我們使用的ValueAnimator。
我們通過addUpdateListener來監聽當前的動畫值,而這個動畫值與我們所設定的范圍和動畫的進度是有直接關系的,那麼如何將我們的動畫進度與具體的動畫值聯繫到一起呢,這個時候就需要用到我們的Evaluator了。比如我們此時初始化了一個0f到500f的動畫,那麼我們可以自定義在0到1的動畫進度內如何去返回具體的動畫的值。
這里呢我們實現了最基礎的線性變化的Evaluator,fraction也就是動畫的進度,范圍0到1,我們就在動畫開始值的進度上加上跟隨時間線性變化的值,所以我們在這里實現了和線性插值器一樣的動畫,注意TypeEvaluator的泛型要與你動畫中的設定的值動畫的類型一致,否則會出錯。
下面我們再修改一下,把它變成瞬移,在動畫執行到一半時直接放在動畫結束的位置
當進度超過0.5時我們直接返回結束的動畫值,否則就放在初始值不動
所以再次驗證了我們的Evaluator生效啦
動畫值的控制一方面可以利用插值器,另一方面Animator也可以使用Evaluator來實現各種插值器所完成的效果,所以在實際的開發中我們可以靈活運用~