/**
* 加载下一张图片
*/
protected void loadNextImg()
{
View view;
// int oldViewPos = mContainer.getChildCount() - 1;
// mViewPos.remove(mContainer.getChildAt(oldViewPos));
// mContainer.removeViewAt(oldViewPos);
//移除第一张图片,且将水平滚动位置置0
// scrollTo(0, 0);
mViewPos.remove(mContainer.getChildAt(0));
mContainer.removeViewAt(0);
//获取下一张图片,并且设置onclick事件,且加入容器中
Log.d("mContainer"," mCurrentIndex=" + mCurrentIndex + " mAdapter.getCount() = " + mAdapter.getCount() );
if(mCurrentIndex == mAdapter.getCount() - 1){
Log.d("mCurrentIndex","mCurrentIndex = " + mCurrentIndex);
Log.d("mAdapter.getCount() - 1","mAdapter.getCount() - 1 = " + mAdapter.getCount());
view = mAdapter.getView(0, null, mContainer);
Log.d("view","0 = " + 0);
mCurrentIndex = 0;
}else{
view = mAdapter.getView(++mCurrentIndex, null, mContainer);
Log.d("view","mCurrentIndex = " + mCurrentIndex);
}
view.setOnClickListener(this);
mContainer.addView(view);
Log.d("mCurrentIndex",mCurrentIndex + "");
// if(keyCodevalue == 1){
// mViewPos.put(view, mCurrentIndex - 1);
// } else{
mViewPos.put(view, mCurrentIndex);
// }
Log.d("mContainer","++++++++ mCurrentIndex=" + mCurrentIndex + " mAdapter.getCount() = " + mAdapter.getCount() );
//此处试验很多次 只能这样将诶绝了,但是滑动还有一点问题
//删掉一下两行,即可
//scrollTo((findViewById(R.id.id_gallery).getWidth()), 0);
//smoothScrollBy(-(findViewById(R.id.id_gallery).getWidth()), 0);
Log.d("id",(findViewById(R.id.id_gallery).getWidth()) + "");
Log.d("mChildWidth",mChildWidth + "");
//当前第一张图片小标
if(mFristIndex == mAdapter.getCount() - 1){
mFristIndex = 0;
} else {
mFristIndex++;
}
Log.d(TAG,mFristIndex + " ");
//如果设置了滚动监听则触发
Log.d("mContainer","++++++++ mCurrentIndex=" + mCurrentIndex + " mFristIndex = " + mFristIndex );
}
/**
* 加载前一张图片
*/
protected void loadPreImg()
{
int oldViewPos = mContainer.getChildCount() - 1;
Log.d("oldViewPos","oldViewPos = "+ oldViewPos);
Log.d("mFristIndex","mFristIndex = "+ mFristIndex);
if (mFristIndex == 0) {
mViewPos.remove(mContainer.getChildAt(oldViewPos));
mContainer.removeViewAt(oldViewPos);
View view = mAdapter.getView(mAdapter.getCount() - 1, null,
mContainer);
Log.d("view","mAdapter.getCount() - 1" + mAdapter.getCount());
mViewPos.put(view, mAdapter.getCount() - 1);
mContainer.addView(view, 0);
view.setOnClickListener(this);
// 水平滚动位置向左移动view的宽度个像素
scrollTo(0, 0);
Log.d("mChildWidth","mChildWidth ="+mChildWidth);
mFristIndex = mAdapter.getCount() - 1;
Log.d("mFristIndex","mFristIndex = "+mFristIndex);
} else {
int index = mCurrentIndex - mCountOneScreen;
Log.d("mCurrentIndex","mCurrentIndex "+ mCurrentIndex);
Log.d("mCountOneScreen","mCountOneScreen "+ mCountOneScreen);
Log.d("index","mCurrentIndex - mCountOneScreen = "+ index);
if (index >= 0) {
mViewPos.remove(mContainer.getChildAt(oldViewPos));
mContainer.removeViewAt(oldViewPos);
View view = mAdapter.getView(index, null, mContainer);
Log.d("view","index = " + index);
mViewPos.put(view, index);
mContainer.addView(view, 0);
view.setOnClickListener(this);
// 水平滚动位置向左移动view的宽度个像素
scrollTo(0, 0);
Log.d("mChildWidth","mChildWidth = "+mChildWidth);
mFristIndex--;
Log.d("mFristIndex","mFristIndex = "+mFristIndex);
} else {
mViewPos.remove(mContainer.getChildAt(oldViewPos));
mContainer.removeViewAt(oldViewPos);
View view = mAdapter.getView(index + mAdapter.getCount(), null,
mContainer);
Log.d("view","index + mAdapter.getCount() = " + index + mAdapter.getCount());
mViewPos.put(view, index + mAdapter.getCount());
mContainer.addView(view, 0);
view.setOnClickListener(this);
// 水平滚动位置向左移动view的宽度个像素
scrollTo(0, 0);
Log.d("mChildWidth","mChildWidth = "+mChildWidth);
// 当前位置--,当前第一个显示的下标--
mFristIndex--;
Log.d("mFristIndex","mFristIndex = "+mFristIndex);
}
}
mCurrentIndex = mViewPos
.get(mContainer.getChildAt(mCountOneScreen - 1));
Log.d("mCurrentIndex","mCurrentIndex = "+mCurrentIndex);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == event.KEYCODE_DPAD_LEFT){
Log.d("keyCodevalue","keyCodevalue = " + keyCodevalue);
if(keyCodevalue == 2){
Log.d("keyCodevalue","zhixing = " + keyCodevalue);
} else {
loadPreImg();
}
keyCodevalue = 1;
}else if(keyCode == event.KEYCODE_DPAD_RIGHT){
Log.d("keyCodevalue","keyCodevalue = " + keyCodevalue);
if(keyCodevalue == 1){
Log.d("keyCodevalue","zhixing = " + keyCodevalue);
} else {
loadNextImg();
}
keyCodevalue = 2;
//阻止右键自己的处理方式
if(keyCodevalue == 1){ //当之前按下的是鼠标左键的情况下,执行
for (int i = 0; i < mContainer.getChildCount(); i++)
{
mContainer.getChildAt(i).setBackgroundColor(Color.WHITE);
}
mListener.onCurrentImgChanged(mFristIndex, mContainer.getChildAt(0));
} else {
for (int i = 0; i < mContainer.getChildCount(); i++)
{
mContainer.getChildAt(i).setBackgroundColor(Color.WHITE);
}
mListener.onCurrentImgChanged(mFristIndex, mContainer.getChildAt(1));
}
return true;
}
if(keyCodevalue == 1){ //当之前按下的是鼠标左键的情况下,执行
for (int i = 0; i < mContainer.getChildCount(); i++)
{
mContainer.getChildAt(i).setBackgroundColor(Color.WHITE);
}
mListener.onCurrentImgChanged(mFristIndex, mContainer.getChildAt(0));
} else {
for (int i = 0; i < mContainer.getChildCount(); i++)
{
mContainer.getChildAt(i).setBackgroundColor(Color.WHITE);
}
mListener.onCurrentImgChanged(mFristIndex, mContainer.getChildAt(1));
}
Log.d("keyCodeValue","mFristIndex = " + mFristIndex);
return super.onKeyDown(keyCode, event);
}
分享到:
相关推荐
HorizontalScrollView在Android开发中是一种常见的布局控件,用于展示可以水平滚动的内容,通常用来实现图片轮播、选项卡切换等效果。在这个demo中,开发者通过学习和实践,创建了一个简单的HorizontalScrollView...
HorizontalScrollView是Android SDK中提供的一种水平滚动视图,它可以容纳多个子View,并允许用户左右滑动查看这些子View。在本教程中,我们将探讨如何基于HorizontalScrollView创建一个自定义的轮播控件,该控件...
总结起来,实现一个自定义的HorizontalScrollView以实现过度滑动时的回弹效果,需要对Android触摸事件处理机制、滚动动画及物理效果有深入理解。通过对`onTouchEvent()`、`computeScroll()`等相关方法的重写和`...
在本教程中,我们将深入探讨如何使用HorizontalScrollView来实现图片的左右滑动效果。 首先,我们需要了解HorizontalScrollView的基本结构。HorizontalScrollView继承自ViewGroup,它包含一个或多个可以滚动的子...
`HorizontalScrollView`是Android SDK提供的一种布局容器,专门用于实现水平方向上的滚动效果,而图片拖放功能则可以通过监听器和触摸事件来实现。下面我们将详细探讨这两个知识点。 首先,`HorizontalScrollView`...
这在展示大量横向排列的数据或图片时非常有用,比如在瀑布流布局或者轮播图组件中。 无限滚动通常通过循环数组或者复用视图来实现。开发者可能采用了以下策略: 1. **数据循环**:将数据集合视为一个环形结构,当...
Gallery组件在早期版本的Android API中被广泛用于展示一系列的图片或元素,用户可以左右滑动来浏览。然而,随着Android版本的更新,Gallery已经被RecyclerView等更灵活的视图容器所替代。但在某些场合,开发者可能...
在Android布局设计中,我们常常遇到需要在横向展示大量内容的情况,比如图片轮播、选项卡或者水平菜单等,这时HorizontalScrollView就显得尤为重要。 HorizontalScrollView的工作原理与常见的垂直滚动的ScrollView...
这篇博客“Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果”提供了一个解决方案,通过自定义HorizontalScrollView来优化内存管理,防止OOM的发生。 首先,理解Android的内存...
而ViewPager则更进一步,它设计用于展示一系列全屏视图,通常用于实现滑动页面的效果,如图片轮播、页面切换等。ViewPager内部已经实现了平滑滚动,因此通常比HorizontalScrollView更适合创建这种交互体验。 在实现...
1、首先让导航栏横向滑动:HorizontalScrollView中放RadioGroup,RadioGroup中放RadioButton。 2、底部为ViewPager。 3、通过设置ViewPager的页面改变来设置RadioButton的模拟点击事件。 4、监听RadioButton点击,来...
总的来说,自定义HorizontalScrollView实现分页效果涉及到对Android的触摸事件处理、视图滚动机制以及动画原理的理解。通过以上步骤,开发者能够创建出具有平滑过渡和分页功能的滚动视图,提升用户体验。在实际项目...
它通常用于展示一列水平排列的元素,如图片轮播、水平导航菜单等。 ScrollView则是一个可以包含单个直接子视图的垂直滚动视图。它确保子视图能够完全显示,即使内容高度超过了屏幕的高度。ScrollView通常用于包含...
在Android开发中,创建一个可滑动的导航菜单通常是实现用户友好界面的重要组成部分。HorizontalScrollView和ViewPager是两个常用的组件,可以用来实现这种效果。本文将深入探讨如何利用这两个组件来构建一个横向左右...
在Android开发中,ViewPager是一个非常常用的组件,它用于展示多个页面并允许用户通过左右滑动来切换页面。然而,有时我们需要实现一些自定义的功能,这时就需要对基础组件进行扩展或重写。本教程将深入探讨如何重写...
HorizontalScrollView是Android提供的一个水平方向上的滚动视图,它允许用户在一个水平方向上滚动多个视图,通常用于展示横向布局的内容,如图片轮播或水平菜单。但是,系统默认的HorizontalScrollView在滚动结束后...
在Android开发中,HorizontalScrollView是一种常用的布局控件,它允许用户水平滚动其内部的子视图。本教程将深入探讨如何利用HorizontalScrollView实现一个类似Gallery的功能,为用户提供一种横向浏览内容的方式。 ...
HorizontalScrollView是Android的一种布局管理器,它允许用户水平滚动其内容。与普通的ScrollView不同,ScrollView默认是垂直滚动,而HorizontalScrollView则支持水平方向的滚动。 在创建自定义...
6. **图片轮播**:HorizontalScrollView常用于实现图片轮播的效果,结合ViewPager或者Handler/Timer等,可以实现自动切换的图片展示。 在实际开发中,我们还需要考虑一些兼容性和用户体验的问题,比如平滑的滚动...