ANDROID GridView 分頁平滑滑動 效果的實現(基於android TV遙控器操作)
阿新 • • 發佈:2019-02-01
1.android 使用GridView 實現載入大量的資料顯示。未顯示出來的資料可以滑動螢幕讓底部的資料顯示出來,但是原生態的GridView 並沒有很美觀平滑的一個動畫來滾動資料,因此,我們可以稍做修改就可以實現 類似VST全聚合裡面 視訊載入也那樣的翻頁動畫效果了。
2.自定義GridView控制元件程式碼如下:
其中關鍵的地方是使用到了 smoothScrollToPositionFromTop(position, offset, duration); 介面函式。/* * @Title: SmoothGridView.java * @Copyright: Corporation. Ltd. Copyright 1998-2018, All rights reserved * @Description: TODO<請描述此檔案是做什麼的> * @author: xjp * @data: 2014年8月20日 上午9:50:57 * @version: V1.0 */ package com.mktech.localapp; import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.AdapterView; import android.widget.GridView; /** * TODO<請描述這個類是幹什麼的> * * @author xjp * @data: 2014年8月20日 上午9:50:57 * @version: V1.0 */ public class SmoothGridView extends GridView { private boolean isScroll = false; private int position = 0; // private int iCount; private int iColumns; private int iFirstView; private int iLastView; private int iselecte; private boolean isFirst = true; static int iPageNum = 0; public SmoothGridView(Context context) { super(context); // TODO Auto-generated constructor stub } @SuppressLint("NewApi") public SmoothGridView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public SmoothGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } // public void setScrollToScrenPosition(int position, boolean isScroll) { // this.position = position; // this.isScroll = isScroll; // } @SuppressLint("NewApi") @Override protected void layoutChildren() { // TODO Auto-generated method stub super.layoutChildren(); if (isFirst) { iFirstView = getFirstVisiblePosition(); iLastView = getLastVisiblePosition(); iPageNum = iLastView - iFirstView + 1; iColumns = getNumColumns(); Log.e(VIEW_LOG_TAG, "iPageNum---->>>" + iPageNum); isFirst = false; } // iCount = getCount(); iselecte = getSelectedItemPosition(); Log.e(VIEW_LOG_TAG, "iFirstView----->>>" + iFirstView + "iLastView--->>>" + iLastView + "iselecte-->>>" + iselecte); this.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && event.getAction() == KeyEvent.ACTION_DOWN) { Log.e(VIEW_LOG_TAG, "iColumns---->>>" + iColumns); if (iselecte % iPageNum >= iPageNum - iColumns && iselecte % iPageNum < iPageNum) { Log.e(VIEW_LOG_TAG, "iselecte---->>>" + iselecte); position = iselecte + iColumns; isScroll = true; } } if (keyCode == KeyEvent.KEYCODE_DPAD_UP && event.getAction() == KeyEvent.ACTION_DOWN) { if (iselecte % iPageNum >= 0 && iselecte % iPageNum < iColumns) { Log.e(VIEW_LOG_TAG, "iselecte---->>>" + iselecte); isScroll = true; position = ((iselecte - iPageNum) / iColumns) * iColumns; } } return false; } }); if (!isScroll) { return; } isScroll = false; Log.e(VIEW_LOG_TAG, "position---->>>" + position); smoothScrollToPositionFromTop(position, 20, 500); } }
public void smoothScrollToPositionFromTop (int position, int offset,int duration)
平滑滾動到指定的介面卡位置。 指定位置的檢視會滾動到相對頂邊偏移 offset 畫素的位置顯示。 如果無法做到(比如該偏移量會使首尾條目超越列表邊緣),會滾動到儘量接近的位置。
引數
position 滾動到的位置
offset 滾動結束時,指定 position 條目距離檢視頂部的畫素數
duration 滾動執行的毫秒數
3.怎麼使用? 像使用自定義控制元件一樣使用。
完整工程程式碼: