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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

仿蜻蜓FM专辑页面滑动特效

發布時間:2024/1/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 仿蜻蜓FM专辑页面滑动特效 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用戶要求一個特效,做了一個Demo,分享一下。

1.羅列代碼

  • ListView headView布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><View android:id="@+id/placeholder_top"android:layout_width="match_parent"android:layout_height="200dp"android:background="@android:color/transparent" /><View android:id="@+id/placeholder_sticky"android:layout_width="match_parent"android:layout_height="50dp" /> </LinearLayout>
  • 主布局文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><View android:id="@+id/top"android:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher" /><ListView android:id="@+id/listView"android:layout_width="match_parent"android:layout_height="wrap_content" ></ListView><TextView android:id="@+id/sticky"android:layout_width="match_parent"android:layout_height="50dp"android:background="#00ffff"android:gravity="center"android:textColor="#ff0000"android:text="Sticky"android:textSize="20sp" /> </FrameLayout>
  • 主代碼
package com.example.android.listviewscrolltrick;import java.util.ArrayList; import java.util.List;import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewTreeObserver; import android.view.Window; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView;import com.example.listviewscrolltrick.R;public class MainActivity extends Activity {private TextView mStickyView;private View mPlaceHolderSticky;private ListView mListView;private View mTopView;@SuppressWarnings("deprecation")@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mStickyView = (TextView) findViewById(R.id.sticky);mListView = (ListView) findViewById(R.id.listView);mTopView = findViewById(R.id.top);LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);View headView = inflater.inflate(R.layout.layout_headview, null);mPlaceHolderSticky = headView.findViewById(R.id.placeholder_sticky);mListView.addHeaderView(headView);mListView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@SuppressLint("NewApi")@SuppressWarnings("deprecation")@Overridepublic void onGlobalLayout() {onScrollChanged();ViewTreeObserver obs = mListView.getViewTreeObserver();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {obs.removeOnGlobalLayoutListener(this);} else {obs.removeGlobalOnLayoutListener(this);}}});mListView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {onScrollChanged();}});List<String> dataSource = new ArrayList<String>();for (int j = 0; j < 20; j++) {dataSource.add("item-----" + j);}ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, dataSource);mListView.setAdapter(arrayAdapter);}private void onScrollChanged() {View v = mListView.getChildAt(0);int top = (v == null) ? 0 : v.getTop();if (mListView.getFirstVisiblePosition() == 0) {mStickyView.setTranslationY(Math.max(mPlaceHolderSticky.getTop()+ top, 0));mTopView.setTranslationY(top);}} }

2.大致原理講解

  • ListView headView存在兩塊區域:R.id.placeholder_top /R.id.placeholder_sticky
    這兩者是“地下工作者”,他們分別與mTopView/mStickView對應——高度相同,顏色透明

  • ListView加載完成后,調整mTopView/mStickView組件的位置

  • ListView滑動時,調整mTopView&&mStickyView的位置

3.結合源代碼對原理進行深入講解

  • 初始階段位置的調整
    對ListView加載完成進行監聽
    注意:要取消監聽
mListView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@SuppressLint("NewApi")@SuppressWarnings("deprecation")@Overridepublic void onGlobalLayout() {onScrollChanged();ViewTreeObserver obs = mListView.getViewTreeObserver();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {obs.removeOnGlobalLayoutListener(this);} else {obs.removeGlobalOnLayoutListener(this);}}});
  • 根據ListView中headView中的對應部分 ,設置mTopView/mStickView位置
private void onScrollChanged() {View v = mListView.getChildAt(0);int top = (v == null) ? 0 : v.getTop();if (mListView.getFirstVisiblePosition() == 0) {mStickyView.setTranslationY(Math.max(mPlaceHolderSticky.getTop()+ top, 0));mTopView.setTranslationY(top);}}

由于mStickyView要一直顯示在可見范圍內,所以mStickyView.setTranslationY一定不能為負數.

  • ListView滑動

監聽ListView滑動,調整mTopView/mStickView的位置(同上)

mListView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {onScrollChanged();}});

3.Demo下載

http://download.csdn.net/detail/guchuanhang/9515429

總結

以上是生活随笔為你收集整理的仿蜻蜓FM专辑页面滑动特效的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。