- 浏览: 172838 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
dupeng41255:
问一下,。com的接口 是不是需要注册啊?我调用的时候返回说需 ...
java实现whois域名查询 -
feiyu86:
比喻的非常贴切。。
synchronized方法和代码块的使用 -
罡风笑:
贴结果:CBH 蜀汉 绝顶 刀客
开心一下 你古代的身份。超级好玩~
Gallery自动循环滚动,手动滚动的平滑切换及存在问题
- 博客分类:
- Android
来自:http://blog.csdn.net/lenghun00/article/details/7635374
@Gallery配合dot使用时,如果放在RelativeLayout中,则手动滑动有反弹现象,其他layout没问题,现在还没弄清原因。
首先继承Gallery重写OnFling函数,去除gallery的滚动惯性
- public class MyGallery extends Gallery {
- public MyGallery(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- }
- private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
- return e2.getX() > e1.getX();
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- int keyCode;
- if (isScrollingLeft(e1, e2)) {
- keyCode = KeyEvent.KEYCODE_DPAD_LEFT;
- } else {
- keyCode = KeyEvent.KEYCODE_DPAD_RIGHT;
- }
- onKeyDown(keyCode, null);
- return true;
- }
- }
public class MyGallery extends Gallery { public MyGallery(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) { return e2.getX() > e1.getX(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { int keyCode; if (isScrollingLeft(e1, e2)) { keyCode = KeyEvent.KEYCODE_DPAD_LEFT; } else { keyCode = KeyEvent.KEYCODE_DPAD_RIGHT; } onKeyDown(keyCode, null); return true; } }
@注OnFling直接返回false也能实现类似效果,但那样需要滑动很大距离,图片才会切换,用户体验不好
第二步,构造adapter
要想平滑的实现循环滚动,可以让getCount返回一个很大的值,这样gallery就认为是有多个item,item之间的切换动画是平滑的
- public class GalleryAdapter extends BaseAdapter {
- private LayoutInflater mInflater;
- private Context mContext;
- private int width;
- private int count;
- private int[] mImageIds;
- public GalleryAdapter(Context context, int[] ids) {
- mContext = context;
- mImageIds = ids;
- mInflater = LayoutInflater.from(mContext);
- DisplayMetrics dm = mContext.getApplicationContext().getResources()
- .getDisplayMetrics();
- width = dm.widthPixels;
- count = mImageIds.length;
- }
- @Override
- public int getCount() {
- return Integer.MAX_VALUE;//用于循环滚动
- }
- @Override
- public Object getItem(int position) {
- return position;
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- position = position % count;
- if (convertView == null) {
- convertView = mInflater.inflate(R.layout.gallery_item, null);
- }
- ImageView v = (ImageView) convertView.findViewById(R.id.img);
- v.setLayoutParams(new Gallery.LayoutParams(width, 200));
- v.setScaleType(ImageView.ScaleType.FIT_XY);
- v.setBackgroundResource(mImageIds[position]);
- return v;
- }
- }
public class GalleryAdapter extends BaseAdapter { private LayoutInflater mInflater; private Context mContext; private int width; private int count; private int[] mImageIds; public GalleryAdapter(Context context, int[] ids) { mContext = context; mImageIds = ids; mInflater = LayoutInflater.from(mContext); DisplayMetrics dm = mContext.getApplicationContext().getResources() .getDisplayMetrics(); width = dm.widthPixels; count = mImageIds.length; } @Override public int getCount() { return Integer.MAX_VALUE;//用于循环滚动 } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { position = position % count; if (convertView == null) { convertView = mInflater.inflate(R.layout.gallery_item, null); } ImageView v = (ImageView) convertView.findViewById(R.id.img); v.setLayoutParams(new Gallery.LayoutParams(width, 200)); v.setScaleType(ImageView.ScaleType.FIT_XY); v.setBackgroundResource(mImageIds[position]); return v; } }
第三,实现自动滚动
由于我们还要手动滚动,所以自动滚动用单独一个进程来实现
- private void startAutoScroll() {
- new Thread() {
- @Override
- public void run() {
- int count = 0;
- while (mAutoScroll) {
- count = 0;
- while (count < 30) {
- count++;
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- if (mOnTouch) {// 用戶手动滑动时,停止自动滚动
- count = 0;
- }
- }
- mPosition++;
- Message msg = mHandler.obtainMessage(SCROLL, mPosition, 0);
- mHandler.sendMessage(msg);
- }
- }
- }.start();
- }
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case SCROLL:
- mGallery.setSelection(msg.arg1);
- break;
- }
- }
- };
private void startAutoScroll() { new Thread() { @Override public void run() { int count = 0; while (mAutoScroll) { count = 0; while (count < 30) { count++; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } if (mOnTouch) {// 用戶手动滑动时,停止自动滚动 count = 0; } } mPosition++; Message msg = mHandler.obtainMessage(SCROLL, mPosition, 0); mHandler.sendMessage(msg); } } }.start(); } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case SCROLL: mGallery.setSelection(msg.arg1); break; } } };
第四实现手动滚动
手动滚动时,要停止自动滚动,监听gallery的onTouch事件,DOWN时mOnTouch置为true,UP时mOnTouch置为false即可
- mGallery.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- int action = event.getAction();
- if (action == MotionEvent.ACTION_DOWN) {
- mOnTouch = true;
- } else if (action == MotionEvent.ACTION_UP) {
- mOnTouch = false;
- }
- return false;
- }
- });
mGallery.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_DOWN) { mOnTouch = true; } else if (action == MotionEvent.ACTION_UP) { mOnTouch = false; } return false; } });
到现在我们已经可以自动滚动,手动滚动时自动滚动也会停止。
我们也许还需要加上dot提示图片滚动的位置
- LinearLayout layout = (LinearLayout) findViewById(R.id.dot);
- if (mDots == null) {
- mDots = new ImageView[ids.length];
- for (int i = 0; i < ids.length; i++) {
- if (mDots[i] == null)
- mDots[i] = new ImageView(this);
- mDots[i].setBackgroundResource(R.drawable.banner_tab_unselected);
- layout.addView(mDots[i], new LinearLayout.LayoutParams(mWidth
- / ids.length + 1, LayoutParams.WRAP_CONTENT));
- }
- mDots[0].setBackgroundResource(R.drawable.banner_tab_selected);
- }
LinearLayout layout = (LinearLayout) findViewById(R.id.dot); if (mDots == null) { mDots = new ImageView[ids.length]; for (int i = 0; i < ids.length; i++) { if (mDots[i] == null) mDots[i] = new ImageView(this); mDots[i].setBackgroundResource(R.drawable.banner_tab_unselected); layout.addView(mDots[i], new LinearLayout.LayoutParams(mWidth / ids.length + 1, LayoutParams.WRAP_CONTENT)); } mDots[0].setBackgroundResource(R.drawable.banner_tab_selected); }
- mGallery.setOnItemSelectedListener(new OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> arg0, View view,
- int position, long arg3) {
- mDotPosition = position % ids.length;
- mDots[mDotPosition]
- .setBackgroundResource(R.drawable.banner_tab_selected);
- if (mDotPosition != mPreDotPosition)
- mDots[mPreDotPosition]
- .setBackgroundResource(R.drawable.banner_tab_unselected);
- mPreDotPosition = mDotPosition;
- }
- @Override
- public void onNothingSelected(AdapterView<?> arg0) {
- }
- });
发表评论
-
Android 属性动画(Property Animation) 完全解析 (下)
2016-02-22 14:49 1030版权声明:本文为博主原创文章,未经博主允许不得转载。 ... -
Android 属性动画(Property Animation) 完全解析 (上)
2016-02-22 14:47 696版权声明:本文为博主原创文章,未经博主允许不得转载。 ... -
Windows系统中Maven的安装与配置以及m2eclipse插件的安装
2014-04-30 16:06 1163近期公司的一个项目需要用maven搭建,所以把maven的环 ... -
Gallery自动循环滚动,手动滚动的平滑切换及存在问题
2012-11-06 10:34 7来自:http://blog.csdn.net/lenghun ... -
VLC for Android on Linux
2012-07-12 14:28 1911来自:http://wiki.videolan.org/And ... -
Android模拟器对应电脑键盘快捷键
2012-01-10 00:01 1367Home键(小房子键) 在键盘上映射的是home键。 ... -
Android的gallery实现无限循环和降低选择频率
2011-07-20 17:55 1459gallery是一个很好用的控 ... -
Android编译问题:Only 64-bit build environments are supported beyond froyo/2.2
2011-03-07 19:01 1105在使用: $ repo init -u git://An ... -
任务管理器正在运行的程序(2)
2010-12-23 14:36 1684RunningTaskInfo AndroidManifes ... -
任务管理器正在运行的程序(1)
2010-12-23 14:26 1494RunningTaskInfo 范例说明 ... -
android 监听文件和目录的创建删除移动等事件
2010-11-11 15:14 1737android.os下的FileObserver类是一个 ... -
animation知识学习
2010-10-22 14:07 2007LinearInterpolator 变化率是个常数,即 f ... -
Android 页面切换动画效果
2010-10-18 12:54 4129在Android 2.0之后有了ove ... -
android自适应屏幕方向和大小
2010-09-27 16:51 1724一:不同的layoutAndroid手机屏幕大小不一,有 ... -
Android图片处理的的一些方法
2010-08-02 18:54 63081.图片加载方法,方便用户加载图片 /**** 加载本地图片 ... -
OMA-SyncML-DataSyncProtocol-V1_1_2-20030612-A
2010-07-02 12:12 634手机联系人等信息同步中使用 -
Android取得屏幕分辨率
2010-05-31 10:32 918WindowManager windowManager = g ... -
Content Providers
2010-03-04 23:21 1169来源:http://developer.andro ... -
Android基础 : Android Content Provider[转]
2010-03-02 23:09 1062Android应用程序可以使用文件或SqlLite数据库来存储 ... -
Android 联系人开发- 保存联系人
2010-03-02 22:46 4720最近在开发android平台的联系人部分,有点总结和大家分享一 ...
相关推荐
ViewPager和Gallery的循环滚动
主要为大家详细介绍了Android使用Recyclerview实现图片水平自动循环滚动效果,实现精彩的跑马灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
ViewPager 无限滚动 gallery效果
Android中Gallery和ImageSwitcher同步自动(滚动)播放图片库
jquery+div带动画按钮图片手动与自动切换的特效代码 jquery一页多用的飞飞图片幻灯插件演示 jquery仿flash产品图片多角度展示特效代码 jquery仿flash图片放大相册的插件代码(Zoomer Gallery)下载 jquery仿flash的...
绝对好用的gallery 经过修改增加倒影,支持自动滚动,手动滚动,图片点击事件,配有图片说明文字
实现Android中gallery图片自动切换。
自定义view实现垂直gallery滚动,字体渐变缩放
Gallery和ImageSwitcher同步自动(滚动)播放图片库
Gallery控件,手动滑动的效果,里面是一个完整的代码
刚刚学习,希望对你有一点点用。这就是循环显示切换图像组件使用方法
请注意看 MainActivity 里的注释 ...功能和 腾讯 应用宝 360手机助手 一样 代码简单 设置简单 自定义圆点 滚动时间 Gallery 实现 滚动图片只有一个类 可加载网络图片 也能使用本地图片 加了好多注释
gallery 加载完图片后,自动滚动到左对齐
imageswitcher和gallery组合,实现超炫壁纸切换功能 gallery切换选择壁纸,背景显示选择项
可以实现gallery浏览图片,手指滑动可以浏览,并且增加了字典里滑动图片方便大家浏览,图片还有文字说明,下面图片滚动标志。
ListView和GridView的使用,Gallery加载图片计时滚动显示。
Gallery无限循环.zip
基于ViewPager的用户指引,广告图片Gallery,及自动轮播图片Gallery,使用起来超简单 eg: imageIndicatorView = (ImageIndicatorView) findViewById(R.id.indicate_view); final Integer[] resArray = new Integer...
主要是熟悉gallery控件的使用,并实现左右滑动的切换图片,类似于ViewPager控件的效果
android 自动滚动图片效果源码,自己做的