版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android应用中实现㝉滑动选择控件
这篇文章给大家介绍怎么在Android应用中实现㝉滑动选择控件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现步骤这里分解为3个动作:Down、Move、Up来进行分析,博主文采不好,大家直接看流程图吧!!代码分析前置知识1、这个地方使用的是RecyclerView的代码,使用RecyclerView只能使用LinearLayoutManager,ListView的运行效果稍微要比RecyclerView差一些//这里使用dispatchTouchEvent,因为onTouchEvent容易被OnTouchListener截取
@Override
public
boolean
dispatchTouchEvent(MotionEvent
ev)
{
LayoutManager
manager
=
getLayoutManager();
//获取第一个和最后一个显示的Item对应的相对Position
if
(manager
instanceof
LinearLayoutManager)
{
mFirstVisiblePosition
=
((LinearLayoutManager)
manager).findFirstVisibleItemPosition();
mLastVisiblePosition
=
((LinearLayoutManager)
manager).findLastVisibleItemPosition();
}
switch
(ev.getAction())
{
case
MotionEvent.ACTION_DOWN:
//获取按下时的位置,x,y
int
startX
=
(int)
ev.getX();
int
startY
=
(int)
ev.getY();
int
preX
=
startX;
mPreY
=
startY;
mPreFirstVisiblePosition
=
mFirstVisiblePosition;
mPrePosition
=
mStartPosition
=
pointToPosition(startX,
startY);
if
(mStartPosition
>
-1)
{
//获取当前Item的View
View
child
=
getChildAt(mStartPosition);
if
(null
!=
child)
{
//获取响应域,一般响应域里面就是一个CheckBox
View
tmpCheckBoxContainer
=
child.findViewWithTag("checkbox_layout");
if
(null
!=
tmpCheckBoxContainer
&&
tmpCheckBoxContainer.getVisibility()
==
VISIBLE)
{
mCheckBoxWidth
=
tmpCheckBoxContainer.getWidth();
//获取响应域的范围,一定要用这种获取绝对位置的方式,不然会受到padding或者是margin的影响
int[]
location
=
new
int[2];
tmpCheckBoxContainer.getLocationOnScreen(location);
mCheckBoxX
=
location[0];
//判断按下的位置是否是在响应域内
if
(startX
>=
mCheckBoxX
&&
startX
<=
(mCheckBoxX
+
mCheckBoxWidth))
{
Log.d(LOG_TAG,
"dispatchTouchEvent()
DOWN
mStartPosition:
"
+
mStartPosition);
//设置截取事件的标志位
mIsNeedScrollCheck
=
true;
//设置为第一次滑动,这是用作判断折返的
mIsFirstMove
=
true;
setStartCheckBoxState();
//截获Checkbox的点击事件,防止两次选中
return
true;
}
else
{
mIsNeedScrollCheck
=
false;
}
}
else
{
mIsNeedScrollCheck
=
false;
Log.e(LOG_TAG,
"dispatchTouchEvent()
",
new
Throwable("Cannot
get
CheckBoxContainer!"));
}
}
else
{
Log.e(LOG_TAG,
"dispatchTouchEvent()
",
new
Throwable("Cannot
get
item
view!"));
}
}
break;
case
MotionEvent.ACTION_MOVE:
//获取当前位置
int
currentX
=
(int)
ev.getX();
int
currentY
=
(int)
ev.getY();
//获取当前的item
int
currentPosition
=
pointToPosition(currentX,
currentY);
//判断是否允许滑动选中
if
(mIsNeedScrollCheck
&&
-1
!=
mFirstVisiblePosition
&&
-1
!=
mLastVisiblePosition
&&
-1
!=
currentPosition)
{
//判断是否在下一个Item的像英语
if
((currentPosition
+
mFirstVisiblePosition)
!=
(mPrePosition
+
mPreFirstVisiblePosition)
&&
currentX
>=
mCheckBoxX
&&
currentX
<=
(mCheckBoxX
+
mCheckBoxWidth))
{
Log.i(LOG_TAG,
"**********************************
dispatchTouchEvent()
********************************");
Log.d(LOG_TAG,
"dispatchTouchEvent()
MOVE
mCurrentPosition:
"
+
currentPosition);
Log.d(LOG_TAG,
"dispatchTouchEvent()
MOVE
mFirstVisiblePosition:
"
+
mFirstVisiblePosition);
Log.d(LOG_TAG,
"dispatchTouchEvent()
MOVE
mPrePosition:
"
+
mPrePosition);
Log.d(LOG_TAG,
"dispatchTouchEvent()
MOVE
mPreFirstVisiblePosition:
"
+
mPreFirstVisiblePosition);
Log.i(LOG_TAG,
"**********************************
dispatchTouchEvent()
********************************");
//折返回来时要改变前一个的Checkbox的状态
if
(mIsFirstMove)
{
mIsFirstMove
=
false;
if
(currentY
>=
mPreY)
{
mUpOrDown
=
false;
}
else
{
mUpOrDown
=
true;
}
}
else
{
if
((currentPosition
+
mFirstVisiblePosition)
>
(mPrePosition
+
mPreFirstVisiblePosition)
&&
mUpOrDown)
{
changeCheckBoxState(mPrePosition);
mUpOrDown
=
false;
}
else
if
((currentPosition
+
mFirstVisiblePosition)
<
(mPrePosition
+
mPreFirstVisiblePosition)
&&
!mUpOrDown)
{
changeCheckBoxState(mPrePosition);
mUpOrDown
=
true;
}
}
changeCheckBoxState(currentPosition);
}
//判断是否是在最后一个item上滑动,如果是则进行自动向下滑动,如果是在第一个上下滑动,则自动向上滑动
//Log.d(LOG_TAG,
"dispatchTouchEvent()
MOVE:
"
+
(mLastVisiblePosition
-
mCurrentPosition
-
mFirstVisiblePosition));
if
((mLastVisiblePosition
-
mFirstVisiblePosition
-
currentPosition)
<
1
&&
currentY
>
mPreY)
{
//自动向下滑
Log.d(LOG_TAG,
"dispatchTouchEvent()
MOVE
mCount:
"
+
mCount);
View
child
=
getChildAt(currentPosition);
if
(null
!=
child
&&
0
==
mCount
%
5)
{
scrollToPosition(mLastVisiblePosition
+
1);
}
mCount++;
}
else
if
(currentPosition
<
2
&&
currentY
<
mPreY)
{
//自动向上滑
View
child
=
getChildAt(currentPosition);
Log.d(LOG_TAG,
"dispatchTouchEvent()
MOVE
mCount:
"
+
mCount);
//mCount用于降低滑动的频率,频率太快容易滑动的看不清楚
if
(null
!=
child
&&
0
==
mCount
%
5)
{
scrollToPosition(mFirstVisiblePosition
-
1);
}
mCount++;
}
mPreY
=
currentY;
mPrePosition
=
currentPosition;
mPreFirstVisiblePosition
=
mFirstVisiblePosition;
return
true;
}
break;
case
MotionEvent.ACTION_UP:
if
(mIsNeedScrollCheck)
{
mCount
=
0;
return
false;
}
break;
}
return
super.dispatchTouchEvent(ev);
}其他的代码片段//改变开始的CheckBox状态
private
void
setStartCheckBoxState()
{
View
child
=
getChildAt(mStartPosition);
if
(null
!=
child)
{
ViewGroup
checkBoxContainer
=
(ViewGroup)
child.findViewWithTag("checkbox_layout");
if
(null
!=
checkBoxContainer)
{
CheckBox
checkBox
=
(CheckBox)
checkBoxContainer.getChildAt(0);
if
(null
!=
checkBox
&&
checkBox.getVisibility()
==
VISIBLE)
{
checkBox.toggle();
}
}
}
}//判断当前Item的Position,相对位置
private
int
pointToPosition(int
x,
int
y)
{
Rect
frame
=
mTouchFrame;
if
(frame
==
null)
{
mTouchFrame
=
new
Rect();
frame
=
mTouchFrame;
}
final
int
count
=
getChildCount();
for
(int
i
=
count
-
1;
i
>=
0;
i--)
{
final
View
child
=
getChildAt(i);
if
(child.getVisibility()
==
View.VISIBLE)
{
child.getHitRect(frame);
if
(frame.contains(x,
y))
{
return
i;
}
}
}
return
-1;
}//改变Position的选中状态
public
void
changeC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程项目管理培训学习体会
- 农业创新科技:病虫害防治方案
- 糖尿病夏季:防晒避暑与防范
- 公司员工聘用协议-行政专员
- 健康规划-高血压的干预方案
- 糖尿病与法律:权益保障指南
- 体育场馆管理:第六章综合管理要点
- 老年抑郁症的临床护理分析
- 三方抵押借款合同
- 城镇排水设施建设、运维管理办法
- 2022年高中名校自主招生初升高衔接数学讲义1 代数式 含答案
- 2022-2023学年广东省中山市八年级下册期末物理检测试题(含解析)
- 国家职业技能标准 (2021年版) 建筑信息模型技术员
- 预制外墙板构造防水施工工艺
- 丹江口库区水源地面源污染调查与研究
- 二年级劳动课教学计划及教材分析
- 百家姓及其五行属性
- 北京三晶传感器说明书
- VOLVO英文缩写汇总
- 新形势下和谐公安监所正规化建设与执法规范指导
- 电气装置安装工程质量检验及评定规程(DOC17页)
评论
0/150
提交评论