日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android自定义控件(三)——有弹性的ListView

發(fā)布時間:2025/3/19 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android自定义控件(三)——有弹性的ListView 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上一次我們試驗(yàn)了有彈性的ScrollView。詳情

這一次,我們來試驗(yàn)有彈性的ScrollView。

國際慣例,效果圖:

?

主要代碼:

?

[java]?view plaincopy
  • import?android.content.Context;??
  • import?android.graphics.Rect;??
  • import?android.util.AttributeSet;??
  • import?android.view.MotionEvent;??
  • import?android.view.animation.Animation;??
  • import?android.view.animation.Animation.AnimationListener;??
  • import?android.view.animation.TranslateAnimation;??
  • import?android.widget.AbsListView;??
  • import?android.widget.ListView;??
  • ??
  • /**?
  • ?*?ElasticScrollView有彈性的ListView?
  • ?*/??
  • public?class?ElasticListView?extends?ListView?{??
  • ????private?float?y;??
  • ????private?Rect?normal?=?new?Rect();??
  • ????private?boolean?animationFinish?=?true;??
  • ??
  • ????public?ElasticListView(Context?context)?{??
  • ????????super(context);??
  • ????????init();??
  • ????}??
  • ??
  • ????public?ElasticListView(Context?context,?AttributeSet?attrs)?{??
  • ????????super(context,?attrs);??
  • ????????init();??
  • ????}??
  • ??
  • ????protected?void?onScrollChanged(int?l,?int?t,?int?oldl,?int?oldt)?{??
  • ??
  • ????}??
  • ??
  • ????boolean?overScrolled?=?false;??
  • ????private?void?init()?{??
  • ????????setOnScrollListener(new?OnScrollListener()?{??
  • ????????????@Override??
  • ????????????public?void?onScrollStateChanged(AbsListView?view,?int?scrollState)?{??
  • ????????????}??
  • ??
  • ????????????@Override??
  • ????????????public?void?onScroll(AbsListView?view,?int?firstVisibleItem,?int?visibleItemCount,?int?totalItemCount)?{??
  • ????????????????overScrolled?=?false;??
  • ????????????}??
  • ????????});??
  • ????}??
  • ??????
  • ????@Override??
  • ????protected?void?onOverScrolled(int?scrollX,?int?scrollY,?boolean?clampedX,?boolean?clampedY)?{??
  • ????????overScrolled?=?true;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?boolean?onTouchEvent(MotionEvent?ev)?{??
  • ????????commOnTouchEvent(ev);??
  • ????????return?super.onTouchEvent(ev);??
  • ????}??
  • ??
  • ????public?void?commOnTouchEvent(MotionEvent?ev)?{??
  • ????????if?(animationFinish)?{??
  • ????????????int?action?=?ev.getAction();??
  • ????????????switch?(action)?{??
  • ????????????case?MotionEvent.ACTION_DOWN:??
  • ????????????????y?=?ev.getY();??
  • ????????????????break;??
  • ????????????case?MotionEvent.ACTION_UP:??
  • ????????????????y?=?0;??
  • ????????????????if?(isNeedAnimation())?{??
  • ????????????????????animation();??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?MotionEvent.ACTION_MOVE:??
  • ????????????????final?float?preY?=?y?==?0???ev.getY()?:?y;??
  • ????????????????float?nowY?=?ev.getY();??
  • ????????????????int?deltaY?=?(int)?(preY?-?nowY);??
  • ??
  • ????????????????y?=?nowY;??
  • ????????????????//?當(dāng)滾動到最上或者最下時就不會再滾動,這時移動布局??
  • ????????????????if?(isNeedMove(deltaY))?{??
  • ????????????????????if?(normal.isEmpty())?{??
  • ????????????????????????//?保存正常的布局位置??
  • ????????????????????????normal.set(getLeft(),?getTop(),?getRight(),?getBottom());??
  • ????????????????????}??
  • ????????????????????//?移動布局??
  • ????????????????????layout(getLeft(),?getTop()?-?deltaY?/?2,?getRight(),?getBottom()?-?deltaY?/?2);??
  • ????????????????}??
  • ????????????????break;??
  • ????????????default:??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????//?開啟動畫移動??
  • ????public?void?animation()?{??
  • ????????//?開啟移動動畫??
  • ????????TranslateAnimation?ta?=?new?TranslateAnimation(0,?0,?0,?normal.top?-?getTop());??
  • ????????ta.setDuration(200);??
  • ????????ta.setAnimationListener(new?AnimationListener()?{??
  • ????????????@Override??
  • ????????????public?void?onAnimationStart(Animation?animation)?{??
  • ????????????????animationFinish?=?false;??
  • ??
  • ????????????}??
  • ??
  • ????????????@Override??
  • ????????????public?void?onAnimationRepeat(Animation?animation)?{??
  • ??
  • ????????????}??
  • ??
  • ????????????@Override??
  • ????????????public?void?onAnimationEnd(Animation?animation)?{??
  • ????????????????clearAnimation();??
  • ????????????????//?設(shè)置回到正常的布局位置??
  • ????????????????layout(normal.left,?normal.top,?normal.right,?normal.bottom);??
  • ????????????????normal.setEmpty();??
  • ????????????????animationFinish?=?true;??
  • ????????????}??
  • ????????});??
  • ????????startAnimation(ta);??
  • ????}??
  • ??
  • ????//?是否需要開啟動畫??
  • ????public?boolean?isNeedAnimation()?{??
  • ????????return?!normal.isEmpty();??
  • ????}??
  • ??
  • ????//?是否需要移動布局??
  • ????public?boolean?isNeedMove(float?deltaY)?{??
  • ????????if?(overScrolled?&&?getChildCount()?>?0)?{??
  • ????????????if?(getLastVisiblePosition()?==?getCount()?-?1?&&?deltaY?>?0)?{??
  • ????????????????return?true;??
  • ????????????}??
  • ????????????if?(getFirstVisiblePosition()?==?0?&&?deltaY?<?0)?{??
  • ????????????????return?true;??
  • ????????????}??
  • ????????}??
  • ????????return?false;??
  • ????}??
  • }??

  • 測試代碼:

    ?

    ?

    [java]?view plaincopy
  • public?class?MainActivity?extends?Activity?{??
  • ????ElasticListView?listView;??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ??????????
  • ????????listView?=?(ElasticListView)?findViewById(R.id.listview);??
  • ??????????
  • ????????String[]?listValues?=?new?String[20];??
  • ????????for?(int?i=0;i<listValues.length;i++)?{??
  • ????????????listValues[i]?=?"TextView"?+?i;??
  • ????????}??
  • ????????listView.setAdapter(new?ArrayAdapter<String>(this,?android.R.layout.simple_list_item_1,?listValues));??
  • ????}??
  • }??
  • ?

    [html]?view plaincopy
  • public?class?MainActivity?extends?Activity?{??
  • ????ElasticListView?listView;??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_main);??
  • ??????????
  • ????????listView?=?(ElasticListView)?findViewById(R.id.listview);??
  • ??????????
  • ????????String[]?listValues?=?new?String[20];??
  • ????????for?(int?i=0;i<listValues.length;i++)?{??
  • ????????????listValues[i]?=?"TextView"?+?i;??
  • ????????}??
  • ????????listView.setAdapter(new?ArrayAdapter<String>(this,?android.R.layout.simple_list_item_1,?listValues));??
  • ????}??
  • }?
  • 總結(jié)

    以上是生活随笔為你收集整理的Android自定义控件(三)——有弹性的ListView的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。