下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android如何實現(xiàn)仿QQ好友詳情頁下拉頂部圖片縮放效果
在下給大家分享一下Android如何實現(xiàn)仿QQ好友詳情頁下拉頂部圖片縮放效果,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!效果圖效果分析1向下滑動,頭部的圖片隨著手指滑動不斷變大2向上滑動,不斷的向上移動圖片,直到圖片不可見3當頂部圖片不可見時,向上滑動,滑動ListView實現(xiàn)思路1由于這個View分上下兩部分,垂直排列,可以通過繼承LinearLayout實現(xiàn)::自定義一個DragImageView,該View繼承LinearLayoutpublic
DragImageView(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
//
默認該View垂直排列
setOrientation(LinearLayout.VERTICAL);
//
用于配合處理該View的慣性滑動
mScroller
=
new
OverScroller(context);
mTouchSlop
=
ViewConfiguration.get(context).getScaledTouchSlop();
mMaximumVelocity
=
ViewConfiguration.get(context)
.getScaledMaximumFlingVelocity();
mMinimumVelocity
=
ViewConfiguration.get(context)
.getScaledMinimumFlingVelocity();
}2onMeasure中設(shè)置內(nèi)容視圖的高度@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec,
heightMeasureSpec);
LayoutParams
params
=
(LayoutParams)
getChildAt(1).getLayoutParams();
//
頭部可以全部隱藏,所以內(nèi)容視圖的高度即為該控件的高度
params.height
=
getMeasuredHeight();
}3設(shè)置ImageView的ScaleType屬性@Override
protected
void
onFinishInflate()
{
super.onFinishInflate();
imageView
=
(ImageView)
getChildAt(0);
//
隨著手指滑動,圖片不斷放大(寬高都大于或者等于ImageView的大?。?,并居中顯示:
//
根據(jù)上邊的分析,CENTER_CROP:可以使用均衡的縮放圖像(保持圖像原始比例),使圖片的兩個坐標(寬、高)都大于等于
相應(yīng)的視圖坐標(負的內(nèi)邊距),圖像則位于視圖的中央
imageView.setScaleType(ScaleType.CENTER_CROP);
listView
=
(ListView)
getChildAt(1);
}4事件攔截@Override
public
boolean
onInterceptTouchEvent(MotionEvent
ev)
{
if
(ev.getAction()
==
MotionEvent.ACTION_DOWN)
{
downX
=
(int)
ev.getX();
downY
=
(int)
ev.getY();
}
if
(ev.getAction()
==
MotionEvent.ACTION_MOVE)
{
int
currentX
=
(int)
ev.getX();
int
currentY
=
(int)
ev.getY();
//
確保是垂直滑動
if
(Math.abs(currentY
-
downY)
>
Math.abs(currentX
-
downX))
{
View
childView
=
listView.getChildAt(listView
.getFirstVisiblePosition());
//
有兩種情況需要攔截:
//
1
圖片沒有完全隱藏
//
2
圖片完全隱藏,但是向下滑動,并且ListView滑動到頂部
if
(getScrollY()
!=
imageHeight
||
(getScrollY()
==
imageHeight
&&
currentY
-
downY
>
0
&&
childView
!=
null
&&
childView.getTop()
==
0))
{
initVelocityTrackerIfNotExists();
mVelocityTracker.addMovement(ev);
return
true;
}
}
}
if
(ev.getAction()
==
MotionEvent.ACTION_UP)
{
recycleVelocityTracker();
}
return
super.onInterceptTouchEvent(ev);
}5onTouchEvent的ACTION_MOVE處理if
(ev.getAction()
==
MotionEvent.ACTION_MOVE)
{
int
currentX
=
(int)
ev.getX();
int
currentY
=
(int)
ev.getY();
int
deltyX
=
currentX
-
downX;
int
deltyY
=
currentY
-
downY;
if
(Math.abs(deltyY)
>
Math.abs(deltyX))
{
if
(deltyY
>
0)
{
if
(getScrollY()
>
0)
{
if
(getScrollY()
-
deltyY
<
0)
{
scrollBy(0,
-getScrollY());
return
true;
}
//
當圖片沒有完全顯示,并且向下滑動時,繼續(xù)整個view使圖片可見
scrollBy(0,
-deltyY);
}
else
{
//
當圖片完全顯示,并且向下滑動時,則不斷的放大圖片(通過改變ImageView)的高度
LayoutParams
layoutParams
=
(LayoutParams)
getChildAt(0)
.getLayoutParams();
layoutParams.height
=
layoutParams.height
+
deltyY
/
2;
getChildAt(0).setLayoutParams(layoutParams);
}
}
else
{
//
當圖片還處于放大狀態(tài),并且向上滑動時,繼續(xù)不斷的縮小圖片的高度,使圖片縮小
if
(getChildAt(1).getTop()
>
imageHeight)
{
LayoutParams
layoutParams
=
(LayoutParams)
getChildAt(0)
.getLayoutParams();
layoutParams.height
=
layoutParams.height
+
deltyY
/
2;
getChildAt(0).setLayoutParams(layoutParams);
}
else
{
//
當圖片處于正常狀態(tài),并且向上滑動時,移動整個View,縮小圖片的可見范圍
if
(getScrollY()
-
deltyY
>
imageHeight)
{
scrollBy(0,
imageHeight
-
getScrollY());
return
true;
}
scrollBy(0,
-deltyY);
}
}
downY
=
currentY;
downX
=
currentX;
return
true;
}
}5onTouchEvent的ACTION_UP處理if
(ev.getAction()
==
MotionEvent.ACTION_UP)
{
//
當圖片處于放大狀態(tài)時松手,使圖片緩慢的縮回到原來的狀態(tài)
if
(getChildAt(1).getTop()
>
imageHeight)
{
isAnimating
=
true;
ValueAnimator
valueAnimator
=
ValueAnimator.ofInt(getChildAt(1)
.getTop(),
imageHeight);
valueAnimator.setDuration(300);
valueAnimator.addUpdateListener(new
AnimatorUpdateListener()
{
@Override
public
void
onAnimationUpdate(ValueAnimator
animation)
{
int
value
=
(Integer)
animation.getAnimatedValue();
LayoutParams
layoutParams
=
(LayoutParams)
getChildAt(0)
.getLayoutParams();
layoutParams.height
=
value;
getChildAt(0).setLayoutParams(layoutParams);
}
});
valueAnimator.addListener(new
AnimatorListenerAdapter()
{
@Override
public
void
onAnimationEnd(Animator
animation)
{
super.onAnimationEnd(animation);
isAnimating
=
false;
}
});
valueAnimator.start();
}
//
當現(xiàn)在圖片處于正常狀態(tài),并且圖片沒有完全隱藏,并且松手時滑動的速度大于可慣性滑動的最小值,讓View產(chǎn)生慣性滑動效果
if
(getChildAt(1).getTop()
==
imageHeight
&&
getSc
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度360借條合同多(信用保險合作協(xié)議)3篇
- 2024物流配送服務(wù)合同服務(wù)范圍
- 2024年食堂就餐卡使用規(guī)定
- 2024年網(wǎng)絡(luò)安全防護系統(tǒng)采購合同
- 2025年度金融產(chǎn)品代理銷售合同2篇
- 2024年退房時房屋損害賠償合同
- 2024版HR干貨目標責任書
- 2024年生產(chǎn)線融資租賃
- 2024野生動物保護項目融資與投資合作協(xié)議3篇
- 2024年財務(wù)數(shù)據(jù)錄入與保管協(xié)議3篇
- 勞務(wù)派遣勞務(wù)外包服務(wù)方案(技術(shù)方案)
- 2023年藥品注冊專員年度總結(jié)及來年計劃
- 圖紙標注常見問題和要求國家標準新版
- 軟件無線電原理與應(yīng)用第3版 課件 第4-6章 軟件無線電硬件平臺設(shè)計、軟件無線電信號處理算法、信道編譯碼技術(shù)
- 兒童ERCP的應(yīng)用及技巧課件
- 《低壓電工技術(shù)》課程標準
- 22G101系列圖集常用點全解讀
- (國家基本公共衛(wèi)生服務(wù)項目第三版)7高血壓患者健康管理服務(wù)規(guī)范
- 12 富起來到強起來 精神文明新風尚(說課稿)-部編版道德與法治五年級下冊
- 中級消防維保理論考試試題題庫及答案
- 讀書會熵減華為活力之源
評論
0/150
提交評論