ANDROID GridView 分页平滑滑动 效果的实现(基于android TV遥控器操作)

1.android 使用GridView 实现加载大量的数据显示。未显示出来的数据可以滑动屏幕让底部的数据显示出来,但是原生态的GridView 并没有很美观平滑的一个动画来滚动数据,因此,我们可以稍做修改就可以实现 类似VST全聚合里面 视频加载也那样的翻页动画效果了。

2.自定义GridView控件代码如下:

/*
 * @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);
	}
}
其中关键的地方是使用到了  smoothScrollToPositionFromTop(position, offset, duration); 接口函数。

public void smoothScrollToPositionFromTop (int position, int offset,int duration)

平滑滚动到指定的适配器位置。 指定位置的视图会滚动到相对顶边偏移 offset 像素的位置显示。 如果无法做到(比如该偏移量会使首尾条目超越列表边缘),会滚动到尽量接近的位置。

参数
position 滚动到的位置
offset 滚动结束时,指定 position 条目距离视图顶部的像素数

duration 滚动执行的毫秒数

3.怎么使用?  像使用自定义控件一样使用。

完整工程代码:

发布了74 篇原创文章 · 获赞 370 · 访问量 74万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览