1. 程式人生 > 其它 >直播帶貨app開發利用ScrollView實現下拉內容重新整理的效果

直播帶貨app開發利用ScrollView實現下拉內容重新整理的效果

直播帶貨app開發利用ScrollView實現下拉內容重新整理的效果

<com.lucas.yanfriends.myview.smoothscroll.StretchContainer
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
app:ratio="0.6">

<com.lucas.yanfriends.myview.smoothscroll.StretchScrollView
android:id="@+id/notify9999"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:fillViewport="true">




</com.lucas.yanfriends.myview.smoothscroll.StretchScrollView>
</com.lucas.yanfriends.myview.smoothscroll.StretchContainer>

StretchContainer.class

packagecom.lucas.yanfriends.myview.smoothscroll;

importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.support.annotation.AttrRes;
importandroid.support.annotation.NonNull;
importandroid.support.annotation.Nullable;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
importandroid.view.ViewConfiguration;
importandroid.view.animation.DecelerateInterpolator;
importandroid.widget.FrameLayout;
importandroid.widget.Scroller;

importcom.lucas.yanfriends.R;


/**
*@authorGimpocreateon2017/9/110:54
*@email:[email protected]
*/

publicclassStretchContainerextendsFrameLayout{

/**
*彈性係數越小說明這個view越難被拉動
*/
privatefloatratio;
/**
*view作出反應最小滑動距離
*/
privateintmTouchSlop;
/**
*這個scroller可以讓滑動更加的順滑不是很突兀的那種寫法固定
*/
privateScrollermScroller;
/**
*允許最大的下拉距離
*/
privatefloatmaxY=600;
/**
*包裹的滾動view可以是所有的view這個view最好能滾動
*/
privateStretchScrollViewmScrollView;
/**
*最大滑動距離
*/
privatefloatmLastY;
/**
*當前view被拖拽
*/
privatebooleanmIsDraging;
/**
*回彈時間
*/
privateintduration=500;

publicStretchContainer(@NonNullContextcontext){
super(context);
initView(context,null);
}

publicStretchContainer(@NonNullContextcontext,@NullableAttributeSetattrs){
super(context,attrs);
initView(context,attrs);
}

publicStretchContainer(@NonNullContextcontext,@NullableAttributeSetattrs,@AttrResintdefStyleAttr){
super(context,attrs,defStyleAttr);
initView(context,attrs);
}

publicvoidinitView(Contextcontext,AttributeSetattrs){
if(attrs!=null){
TypedArraya=context.obtainStyledAttributes(attrs,R.styleable.StretchContainer);
ratio=a.getFloat(R.styleable.StretchContainer_ratio,1.0f);
}
ViewConfigurationconfig=ViewConfiguration.get(context);
mTouchSlop=config.getScaledTouchSlop();
DecelerateInterpolatorinterpolator=newDecelerateInterpolator();
mScroller=newScroller(context,interpolator);
}

@Override
protectedvoidonFinishInflate(){
super.onFinishInflate();
mScrollView=(StretchScrollView)getChildAt(0);
}

@Override
publicbooleandispatchTouchEvent(MotionEventev){
floatcurrentY=ev.getY();
switch(ev.getAction()){
caseMotionEvent.ACTION_DOWN:
mLastY=currentY;
break;
caseMotionEvent.ACTION_MOVE:
floatdistanceY=currentY-mLastY;
if(mIsDraging){
if(distanceY<=0){
if(mScrollView.isScrolledToTop()){
scrollTo(0,0);
mIsDraging=false;
returnsuper.dispatchTouchEvent(ev);
}
}else{
if(mScrollView.isScrolledToBottom()){
scrollTo(0,0);
mIsDraging=false;
returnsuper.dispatchTouchEvent(ev);
}
}
scrollTo(0,(int)(-distanceY*ratio));
returntrue;
}else{
if(Math.abs(distanceY)>mTouchSlop){
if(distanceY>0){//向下
if(mScrollView.isScrolledToTop()){
mLastY=currentY;
mIsDraging=true;
}
}else{
if(mScrollView.isScrolledToBottom()){
mLastY=currentY;
mIsDraging=true;
}
}
}
}
break;
caseMotionEvent.ACTION_UP:
if(mIsDraging){
intscrollY=getScrollY();
mScroller.startScroll(0,scrollY,0,-scrollY,duration);
mIsDraging=false;
invalidate();
returntrue;
}
break;
}
returnsuper.dispatchTouchEvent(ev);
}

@Override
publicvoidcomputeScroll(){
//判斷是否還在滾動,還在滾動為true
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
//更新介面
postInvalidate();
}
super.computeScroll();
}
}

StretchScrollView.class

packagecom.lucas.yanfriends.myview.smoothscroll;

importandroid.content.Context;
importandroid.util.AttributeSet;
importandroid.widget.ScrollView;

/**
*@authorGimpocreateon2017/9/112:06
*@email:[email protected]
*/

publicclassStretchScrollViewextendsScrollView{
privatebooleanisScrolledToTop=true;
privatebooleanisScrolledToBottom;

publicStretchScrollView(Contextcontext){
super(context);
}

publicStretchScrollView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}

publicStretchScrollView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
}

@Override
protectedvoidonScrollChanged(intl,intt,intoldl,intoldt){
super.onScrollChanged(l,t,oldl,oldt);
if(getScrollY()==0){//小心踩坑1:這裡不能是getScrollY()<=0
setScrolledToTop(true);
setScrolledToBottom(false);
}elseif(getScrollY()+getHeight()-getPaddingTop()-getPaddingBottom()==getChildAt(0).getHeight()){
//小心踩坑2:這裡不能是>=
//小心踩坑3(可能忽視的細節2):這裡最容易忽視的就是ScrollView上下的padding 
setScrolledToTop(false);
setScrolledToBottom(true);
}else{
setScrolledToTop(false);
setScrolledToBottom(false);
}
}


publicbooleanisScrolledToTop(){
returnisScrolledToTop;
}

publicvoidsetScrolledToTop(booleanscrolledToTop){
isScrolledToTop=scrolledToTop;
}

publicbooleanisScrolledToBottom(){
returnisScrolledToBottom;
}

publicvoidsetScrolledToBottom(booleanscrolledToBottom){
isScrolledToBottom=scrolledToBottom;
}
}

以上就是直播帶貨app開發利用ScrollView實現下拉內容重新整理的效果, 更多內容歡迎關注之後的文章