相册控件Gallery里,点击选中其中的项目,会自动将选中的项目滑动到中间。不过最近项目中遇到需要实现禁止这种滑动,大致折腾一番基本实现这种效果。

Gallery类本身没有提供能直接设置这种效果的方法,setXXX或onXXX方法之类的,基本确立得自定义一个Gallery了。

首先,Gallery里出发点击事件会响应Gallery的onSingleTapUp方法(无论点击到项目还是空白部分),andriod 官方的说明为“Notified when a tap occurs with the up MotionEventthat triggered it.”

看一下源码,android.widget.Gallery---(注:这边看的都是2.2的源码)

    public boolean onSingleTapUp(MotionEvent e) {if (mDownTouchPosition >= 0) {// An item tap should make it selected, so scroll to this child.scrollToChild(mDownTouchPosition - mFirstPosition);// Also pass the click so the client knows, if it wants to.if (mShouldCallbackOnUnselectedItemClick || mDownTouchPosition == mSelectedPosition) {performItemClick(mDownTouchView, mDownTouchPosition, mAdapter.getItemId(mDownTouchPosition));}return true;}return false;}

注意到这里的红色部分的scrollToChild方法,这名字.........跟进去看

    private boolean scrollToChild(int childPosition) {View child = getChildAt(childPosition);if (child != null) {int distance = getCenterOfGallery() - getCenterOfView(child);mFlingRunnable.startUsingDistance(distance);return true;}return false;}

很清楚看到,Gallery响应点击事件会自动把选中项目滚到中间的原因了....

另外,Gallery不是还有个OnItemClickListener能去自定义吗?看一下onSingleTapUp方法中,scrollToChild执行之后才会调用的performItemClick方法,这个时候才会响应OnItemClickListener的onItemClick方法

android.widget.AdapterView

    public boolean performItemClick(View view, int position, long id) {if (mOnItemClickListener != null) {playSoundEffect(SoundEffectConstants.CLICK);mOnItemClickListener.onItemClick(this, view, position, id);return true;}return false;}

所以我们要做的事情就是自定义一个Gallery重写这个onSingleTapUp方法了

test.view.CustomGallery

public class CustomGallery extends Gallery {
 // 自定义的构造方法至少包含这种带两个参数的,不然使用时会报错public EffectGallery(Context context, AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean onSingleTapUp(MotionEvent e) {
  // 此处添加需要的逻辑return false;}}










注意,方法返回false来隔断后面的操作,不要用true

自定义View在layout里面的使用方法和普通控件类似,只是名字改成 包名+类名即可,例如<test.view.CustomGallery />

做到这里相当于只是屏蔽Gallery本身的点击处理,而且这个方法里并不能得到选中的项目的position之类的信息....
这边采取的做法是,Gallery所绑定的数据Adaptor(自定义)的getView方法中,设置onTouch监听事件来取得点击的postion之类相关信息
大致的代码:
public class MenuEffectGridAdapter extends BaseAdapter {private Activity mActivity;private List<CustomDto> mResList;private int touchPositon = -1;public MenuEffectGridAdapter(Activity pActivity, List<CustomDto> pResList) {mActivity = pActivity;mResList = pResList;}@Overridepublic int getCount() {return mResList.size();}@Overridepublic Object getItem(int position) {return mResList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = convertView;if (view == null) {LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);view = inflater.inflate(R.layout.customLayout, null); }final int selectPostion = position;view.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {touchPositon = selectPostion;return false;}});// 如果使用onClick监听,会导致Gallery里,触及子项目View无法进行滑动,原因不明,待查//view.setOnClickListener(new OnClickListener() {// @Override//    public void onClick(View v) {//     //  }//});return view;}public int getTouchPositon() {return touchPositon;}public void setTouchPostion(int position) {touchPositon = position;}
}
这样,基本绕开了Gallery本身的点击后自动滑动到中间的现象,其中需要注意的是,Gallery中点击空白区域小心position的处理。

Android随记------GalleryView禁止选中项目向中间滑动相关推荐

  1. Android Studio 使用教程(4)---gradle项目构建

    Android Studio 使用教程(四)之gradle项目构建 1.gradle的概念 2.gradle配置jar包,和libs文件夹导入jar包的区别 3.签名打包:     (1)Studio ...

  2. 【安卓学习之开发工具】 Android 学习-- 下载过的一些项目

    █ [安卓学习之开发工具] Android 学习-- 下载过的一些项目 █ 相关文章: ● [安卓学习之常见问题] app维护可能遇到的问题 ● [IOS学习之常见问题] app维护可能遇到的问题 ● ...

  3. ie禁止html复制元素,JavaScript_禁止选中文字兼容IE、Chrome、FF等,复制代码 代码如下: $(el).attr('u - phpStudy...

    禁止选中文字兼容IE.Chrome.FF等 $(el).attr('unselectable','on') .css({'-moz-user-select':'-moz-none', '-moz-us ...

  4. Android开发之旅:HelloWorld项目的目录结构

    引言 前面Android开发之旅:环境搭建及HelloWorld,我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目,本篇将通过HelloWorld项目来介绍Androi ...

  5. 前端开发css禁止选中文本

    在我们日常的Java web前端开发的过程中呢,程序员们会遇到各种各样的要求,所以不每天学的东西感觉自己都退步了,都更不上时代的发展了. 每天应对各种需求,每天活在疑问中就是我们程序员的真是写照.但我 ...

  6. android添加工程依赖工程,将项目依赖项添加到Android studio中的另一个项目

    我有一个现有的项目说A,它依赖于几个项目.现在我想将这个项目A作为Project B的库项目.到目前为止,我所做的是在Project A的build.gradle中,我已将插件从"andro ...

  7. JavaScript 双击禁止选中文字

    // 双击禁止选中文字 window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty ...

  8. Android手机通讯录备份和恢复项目

    Android手机通讯录备份和恢复项目 附下载地址** 登录功能 注册功能 找回密码 修改密码 备份功能 恢复功能 恢复数据从服务器 导出为Excel文件 登录功能 注册功能 找回密码 同注册功能 修 ...

  9. Ant Design of Vue 中 日期时间控件 禁止选中的(日期——)设置

    实现控件 新建活动 限制开始时间 必须大于当前时间20分钟 html<a-range-picker:class="{'has-error':startHasError || endtH ...

最新文章

  1. Ncut matlab 代码bug 修复
  2. 使用DBLink方式同步远程数据库中含Blob、Clob字段表的问题解决
  3. JAVA15.JDK15.6 Record二次预览特性
  4. python1.学生管理系统
  5. C语言开发笔记(一)自动转换和强制转换
  6. 计算机风格学,由风格学习算法自动生成大规模手写字体
  7. 计算机辅助普通话水平测试指导,计算机辅助普通话水平测试指南38563
  8. c语言顺序存储构建一棵二叉树,C语言 数据结构堆排序顺序存储(升序)
  9. Streaming源码解读 updateStateByKey-1
  10. VS2010:把项目由WIN32改为x64
  11. 2w 字长文带你搞懂 Linux 命令行
  12. 串口服务器是什么,有什么功能
  13. 单片机晶振电路的设计与计算
  14. 统计文件中元音字母的数量
  15. 数字图像处理Python语言实现-图像增强-导向滤波(Guided Filter)
  16. 对人工智能芯片的一些看法
  17. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例
  18. 最新限量红包封面,限时领取!
  19. 使用Python的Scrapy框架编写web爬虫的简单示例
  20. 【K哥爬虫普法】蓄意突破反爬虫技术,爬取牌照信息

热门文章

  1. Unreal Open Day 2017 参会总结——腾讯逆战游戏项目制作经验分享
  2. 一个微信小程序云函数例子(详细)
  3. 设计题目:门禁管理系统(DOS)
  4. SQL中EXISTS理解使用
  5. 刘备、关羽、张飞现代创业
  6. 批处理常用命令及用法
  7. source insight破解问题汇总与解决
  8. Source Insight 4 安装与破解
  9. c语言fscanf读取结构体变量,怎样用fscanf读入结构体变量
  10. 洛谷P2257 YY的GCD