版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android實(shí)現(xiàn)炫酷播放效果的方法
在下給大家分享一下Android實(shí)現(xiàn)炫酷播放效果的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!具體內(nèi)容如下一、首先看效果二、實(shí)現(xiàn)原理使用貝塞爾曲線實(shí)現(xiàn)滑動效果,在使用屬性動畫實(shí)現(xiàn)水波紋效果,然后就能實(shí)現(xiàn)以上效果三、實(shí)現(xiàn)1、先封裝動畫框架,創(chuàng)建動畫基礎(chǔ)類PathPoint.javapublic
class
PathPoint
{
public
static
final
int
MOVE
=
0;
public
static
final
int
LINE
=
1;
public
static
final
int
CURVE
=
2;
float
mControl0X,
mControl0Y;
float
mControl1X,
mControl1Y;
public
float
mX,
mY;
int
mOperation;
//line/move
private
PathPoint(int
operation,
float
x,
float
y)
{
this.mOperation
=
operation;
this.mX
=
x;
this.mY
=
y;
}
//curve
private
PathPoint(float
c0X,
float
c0Y,
float
c1X,
float
c1Y,
float
x,
float
y)
{
this.mControl0X
=
c0X;
this.mControl0Y
=
c0Y;
this.mControl1X
=
c1X;
this.mControl1Y
=
c1Y;
this.mX
=
x;
this.mY
=
y;
this.mOperation
=
CURVE;
}
public
static
PathPoint
moveTo(float
x,
float
y)
{
return
new
PathPoint(MOVE,
x,
y);
}
public
static
PathPoint
lineTo(float
x,
float
y)
{
return
new
PathPoint(LINE,
x,
y);
}
public
static
PathPoint
curveTo(float
c0X,
float
c0Y,
float
c1X,
float
c1Y,
float
x,
float
y)
{
return
new
PathPoint(c0X,
c0Y,
c1X,
c1Y,
x,
y);
}
}2、創(chuàng)建動畫集合類,并且保存繪制軌跡AnimatorPathpublic
class
AnimatorPath
{
//記錄軌跡
private
List<PathPoint>
mPoints
=
new
ArrayList<>();
public
void
moveTo(float
x,
float
y)
{
mPoints.add(PathPoint.moveTo(x,
y));
}
public
void
lineTo(float
x,
float
y)
{
mPoints.add(PathPoint.lineTo(x,
y));
}
public
void
curveTo(float
c0X,
float
c0Y,
float
c1X,
float
c1Y,
float
x,
float
y)
{
mPoints.add(PathPoint.curveTo(c0X,
c0Y,
c1X,
c1Y,
x,
y));
}
public
Collection<PathPoint>
getPoints()
{
return
mPoints;
}
}3、實(shí)現(xiàn)頁面布局<?xml
version="1.0"
encoding="utf-8"?>
<RelativeLayout
xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffe8e8e8">
<ImageView
android:id="@+id/album_cover"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="#22eeff"
/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_below="@id/album_cover"
android:layout_marginTop="-15dp"
android:background="@color/colorPrimary"
android:elevation="4dp"
android:minHeight="?attr/actionBarSize"
android:paddingLeft="72dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:text="大海大海"
android:textColor="#FFF"
android:textSize="30sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:fontFamily="sans-serif-light"
android:text="王小二"
android:textColor="#9cffffff"
android:textSize="18sp"
/>
</LinearLayout>
</android.support.v7.widget.Toolbar>
<FrameLayout
android:id="@+id/fab_container"
android:layout_width="match_parent"
android:layout_height="128dp"
android:layout_below="@id/album_cover"
android:layout_marginTop="-30dp"
android:elevation="10dp">
<LinearLayout
android:id="@+id/media_controls_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:scaleX="0"
android:scaleY="0"
android:src="@mipmap/play"
/>
<ImageView
android:id="@+id/iv_pause_play"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:scaleX="0"
android:scaleY="0"
android:src="@mipmap/play"
/>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginRight="50dp"
android:scaleX="0"
android:scaleY="0"
android:src="@mipmap/play"
/>
</LinearLayout>
<ImageButton
android:id="@+id/fab"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="top|right"
android:layout_marginRight="72dp"
android:background="@drawable/ripple"
android:elevation="5dp"
android:onClick="onPabPressed"
android:transitionName="button_fab"
/>
</FrameLayout>
</RelativeLayout>4、獲取控件,并且設(shè)置點(diǎn)擊事件,設(shè)置一些動畫常量private
View
mFab;
private
FrameLayout
mFabcontainer;
private
LinearLayout
mControlsContainer;
//從什么時候開始執(zhí)行動畫
private
static
final
float
SCALE_FACTOR
=
13f;
//持續(xù)時間
private
static
final
long
ANIMATION_DURATION
=
300;
//貝塞爾曲線滑動到什么時候開始執(zhí)行動畫
private
static
final
float
MINIMUN_X_DISTANCE
=
200;
private
boolean
mRevealFlag;
private
float
mFabSize;5、給mFab設(shè)置點(diǎn)擊事件private
void
onFabPressed(View
view)
{
final
float
startX
=
mFab.getX();
//開始動畫
AnimatorPath
path
=
new
AnimatorPath();
path.moveTo(0,
0);
path.curveTo(-200,
200,
-400,
100,
-600,
50);
//
path.lineTo(-600,50);
ObjectAnimator
anim
=
ObjectAnimator.ofObject(this,
"fabLoc",
new
PathEvaluator(),
path.getPoints().toArray());
anim.setInterpolator(new
AccelerateInterpolator());
//
anim.setRepeatCount(ValueAnimator.INFINITE);
//
anim.setRepeatMode(ValueAnimator.REVERSE);
anim.setDuration(ANIMATION_DURATION);
anim.start();
anim.addUpdateListener(new
ValueAnimator.AnimatorUpdateListener()
{
@Override
public
void
onAnimationUpdate(ValueAnimator
valueAnimator)
{
//到了path路徑中的某個位置就是開始擴(kuò)散動畫
if
(Math.abs(startX
-
mFab.getX())
>
MINIMUN_X_DISTANCE)
{
if
(!mRevealFlag)
{
ImageButton
fab
=
(ImageButton)
mFab;
fab.setImageDrawable(new
BitmapDrawable());
//看布局里邊的FabContainer要比toolbar背景高mFabSize/2(為了最初的半個fab效果)
mFabcontainer.setY(mFabcontainer.getY()
+
mFabSize
/
2);
//fab放大動畫
mFab.animate()
.scaleXBy(SCALE_FACTOR)
.scaleYBy(SCALE_FACTOR)
.setListener(mEndRevealListener)
.setDuration(ANIMATION_DURATION);
mRevealFlag
=
true;
}
}
}
});
}
public
void
setFabLoc(PathPoint
newLoc)
{
mFab.setTranslationX(newLoc.mX);
if
(mRevealFlag)
{
//因?yàn)椴季掷镞叺膍Fabcontainer要比toolbar背景高mFabSize/2,所以fab為了看起來平順,需要上移mFabSize/2
mFab.setTranslationY(newLoc.mY
-
(mFabSize
/
2));
}
else
{
mFab.setTranslationY(newLoc.mY);
}
}
private
AnimatorListenerAdapter
mEndRevealListener
=
new
AnimatorListenerAdapter()
{
@Override
public
void
onAnimationEnd(Animator
animation)
{
super.onAnimationEnd(animation);
mFab.setVisibility(View.INVISIBLE);
mFabcontainer.setBackgroundColor(getResources().getColor(R.color.colorAccent));
//reveal動畫完畢后,接著每一個子控件都有個縮放動畫(依次順序出來)
for
(int
i
=
0;
i
<
mControlsContainer.getChildCount();
i++)
{
View
v
=
mControlsContainer.getChildAt(i);
ViewPropertyAnimator
animate
=
v.animate()
.scaleX(1)
.scaleY(1)
.setDuration(ANIMATION_DURATION);
animate.setStartDelay(i
*
50);
animate.start();
}
}
};PathEvaluatorpublic
class
PathEvaluator
implements
TypeEvaluator<PathPoint>
{
@Override
public
PathPoint
evaluate(float
t,
PathPoint
startValue,
PathPoint
endValue)
{
//t執(zhí)行的百分比
(0~1)
floa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度股權(quán)轉(zhuǎn)讓及技術(shù)服務(wù)合同2篇
- 二零二五版建筑門窗材料采購及安裝服務(wù)合同3篇
- 二零二五版?zhèn)€人信用擔(dān)保二手房購買貸款合同樣本3篇
- 武漢托管班2025年度教師招聘與素質(zhì)教育服務(wù)合同3篇
- 二零二五版智慧城市基礎(chǔ)設(shè)施勘察設(shè)計(jì)服務(wù)合同3篇
- 2025年度安全生產(chǎn)應(yīng)急救援預(yù)案合同范本3篇
- 二零二五版智能倉儲物流中心設(shè)施維護(hù)與安全管理合同3篇
- 二零二五年建筑水電安裝工程合同風(fēng)險(xiǎn)評估合同2篇
- 深圳市2025年度房地產(chǎn)股權(quán)交易合同(含工業(yè)地產(chǎn))3篇
- 二零二五版二手房買賣合同補(bǔ)充協(xié)議(歷史遺留問題)范本3篇
- 南充化工碼頭管網(wǎng)施工方案(初稿)
- 2023年消防接警員崗位理論知識考試參考題庫(濃縮500題)
- GB/T 30285-2013信息安全技術(shù)災(zāi)難恢復(fù)中心建設(shè)與運(yùn)維管理規(guī)范
- 魯濱遜漂流記閱讀任務(wù)單
- 第一章 運(yùn)營管理概論1
- 《創(chuàng)意繪畫在小學(xué)美術(shù)教育中的應(yīng)用(論文)6000字》
- 主體結(jié)構(gòu)驗(yàn)收匯報(bào)材料T圖文并茂
- 管理學(xué)原理(南大馬工程)
- 過一個有意義的寒假課件
- 施工現(xiàn)場裝配式集裝箱活動板房驗(yàn)收表
- 電力業(yè)擴(kuò)工程竣工驗(yàn)收單
評論
0/150
提交評論