版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android应用中利用onTouchEvent实现一个滑动布局
本篇文章给大家分享的是有关怎么在Android应用中利用onTouchEvent实现一个滑动布局,在下觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着在下一起来看看吧。1、booleanonTouch(Viewv,MotionVentevent)触摸事件发送到视图时调用(v:视图,event:触摸事件)返回true:事件被完全消耗(即,从down事件开始,触发move,up所有的事件)返回fasle:事件未被完全消耗(即,只会消耗掉down事件)2、booleanonTouchEvent(MotionEventevent)触摸屏幕时调用返回值,同上须知1、onTouch优先级比onTouchEvent高2、如果button设置了onTouchListener监听,onTouch方法返回了true,就不会调用这个button的Click事件运用onTouchEvent写一个能滑动的布局需求:1.刚进入界面外层布局,自动下滑一段距离,露出内层布局。2.外层布局可以上下滑动,并且带有透明度渐变效果,改变内边距效果。需求分析:1.显然,外层布局要默认覆盖内层布局了,这个容易。自动下滑,要用到动画,ObjectAnimator2.外层布局要实现上下滑动,那么需要自定义,对onTouchEvent重写(核心逻辑)代码如下:/**
*
Author:Biligle.
*
自定义布局
*/
public
class
MyViewGroup
extends
ViewGroup
{
private
MyViewGroupListener
listener;//接口,监听滑动事件
private
int
vertical
=
0;//布局距离顶端距离(默认0)
public
MyViewGroup(Context
context)
{
super(context);
}
public
MyViewGroup(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
}
public
MyViewGroup(Context
context,
AttributeSet
attrs,
int
defStyleAttr)
{
super(context,
attrs,
defStyleAttr);
}
@RequiresApi(api
=
Build.VERSION_CODES.LOLLIPOP)
public
MyViewGroup(Context
context,
AttributeSet
attrs,
int
defStyleAttr,
int
defStyleRes)
{
super(context,
attrs,
defStyleAttr,
defStyleRes);
}
private
int
downY
=
0;//按下时的点
private
int
slide
=
0;//最终移动距离
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
switch
(event.getAction()){
case
MotionEvent.ACTION_DOWN:
downY
=
(int)
event.getY();
break;
case
MotionEvent.ACTION_MOVE:
slide
=
downY
-
(int)event.getY();
if(slide
<
0){//下滑
vertical
=
listener.marginTop(Math.abs(slide));
}else
if(slide
>
0){//上滑
vertical
=
listener.marginTop(-slide);
}
break;
case
MotionEvent.ACTION_UP:
if(vertical
<
300){
//布局距离屏幕顶部小于300,就让布局充满整个屏幕
vertical
=
listener.marginTop(0);
}
break;
}
return
true;
}
/**
*
测量子View
*
@param
widthMeasureSpec
*
@param
heightMeasureSpec
*/
@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec,
heightMeasureSpec);
for
(int
i
=
0;
i
<
getChildCount();
i++)
{
View
child
=
getChildAt(i);
//系统测量
measureChild(child,
widthMeasureSpec,
heightMeasureSpec);
}
}
/**
*
安排子View的位置
*
@param
changed
*
@param
l
左边距
*
@param
t
上边距
*
@param
r
右边距
*
@param
b
下边距
*/
@Override
protected
void
onLayout(boolean
changed,
int
l,
int
t,
int
r,
int
b)
{
int
left
=
0,
top
=
0,
right
=
0,
bottom
=
0;
for
(int
i
=
0;
i
<
getChildCount();
i++)
{
View
child
=
getChildAt(i);
right
=
left
+
child.getMeasuredWidth();
bottom
=
top
+
child.getMeasuredHeight();
child.layout(left,
top,
right,
bottom);
}
}
public
void
setListener(MyViewGroupListener
listener){
this.listener
=
listener;
}
interface
MyViewGroupListener
{
/**
*
设置topMargin,上下滑动时触发
*
@param
slide
滑动距离
*
@return
当前上边距
*/
int
marginTop(int
slide);
}
}public
class
MainActivity
extends
AppCompatActivity
implements
MyViewGroup.MyViewGroupListener{
/**
自定义布局(外层布局)*/
private
MyViewGroup
myViewGroup;
/**
两个圆形图(在外层布局)*/
private
ImageView
iv1,iv2/*,cloud*/;
/**
包裹圆形图的布局*/
private
RelativeLayout
relativeLayout;
/**
外层布局参数类(这里用到了params.topMargin:上边距)*/
private
ViewGroup.MarginLayoutParams
params;
/**
透明值(改变两个圆图的透明值)*/
private
float
f;
/**
左右内边距(改变RelativeLayout内边距)*/
private
int
p;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myViewGroup
=
(MyViewGroup)
findViewById(R.id.my);
myViewGroup.setListener(this);
iv1
=
(ImageView)
findViewById(R.id.iv1);
iv2
=
(ImageView)
findViewById(R.id.iv2);
relativeLayout
=
(RelativeLayout)
findViewById(R.id.relative);
params
=
(ViewGroup.MarginLayoutParams)
myViewGroup.getLayoutParams();
//初始化动画(自动下滑一段儿距离),我这里写死了900
ObjectAnimator
animator
=
ObjectAnimator.ofFloat(myViewGroup,"translationY",
900);
animator.setDuration(2000);
animator.addUpdateListener(new
ValueAnimator.AnimatorUpdateListener()
{
@Override
public
void
onAnimationUpdate(ValueAnimator
animation)
{
float
y
=
(float)animation.getAnimatedValue();
f
=
y/800;
p
=
(int)
y/3;
alpha(f);
padding(p);
}
});
animator.start();
//
cloud
=
(ImageView)
findViewById(R.id.cloud);
}
/**
*
设置上边距
*
@param
slide
滑动距离
*
@return
返回下滑布局,距离屏幕左上角的垂直距离
*/
@Override
public
int
marginTop(int
slide)
{
params.topMargin
+=
slide;
myViewGroup.setLayoutParams(params);
int
vertical
=
(900
+
params.topMargin);
if(slide
==
0){
//为了隐藏两张圆图,所以把Relativelayout的高度一并减除。
params.topMargin
-=
(vertical+relativeLayout.getHeight());
myViewGroup.setLayoutParams(params);
}
float
alpha
=
f
+
(float)
params.topMargin/800;//自定义一个算法
alpha(alpha);
int
padding
=
p
+
params.topMargin/3;//自定义一个算法
padding(padding);
return
vertical;
}
/**
*
设置透明度
*
@param
alpha
透明值
*/
public
void
alpha(float
alpha)
{
iv1.setAlpha(alpha);
iv2.setAlpha(alpha);
}
/**
*
设置左右边距
*
@param
padding
边距值
*/
public
void
padding(int
padding)
{
relativeLayout.setPadding(padding,
0,
padding,
0);
}<?xml
version="1.0"
encoding="utf-8"?>
<RelativeLayout
xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wgl.viewgroup1.MainActivity">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/pic"
android:scaleType="fitXY"/>
<!--<ImageView-->
<!--android:id="@+id/cloud"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_centerHorizontal="true"-->
<!--android:alpha="0.8"-->
<!--android:src="@mipmap/cloud3"-->
<!--android:clickable="true"/>-->
<com.wgl.viewgroup1.MyViewGroup
android:id="@+id/my"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.8"
android:layout_alignParentTop="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/relative"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.wgl.viewgroup1.CircleImageView
android:id="@+id/iv1"
android:layout_width="wrap_content"
android:layout_height="wrap_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 元宵节联欢晚会演出活动方案范文(3篇)
- 《调皮的日子》读书心得感悟
- 学校校园足球工作方案范文(3篇)
- 银行职业规划职业规划范文
- 转学申请书范文集锦
- 员工辞职申请书【13篇】
- 初一新生少先队员竞选演讲稿(21篇)
- 2023年关爱老人国旗下讲话稿范文(21篇)
- 追悼会家属答谢词合集
- 中学生沉迷游戏倡议书范文(18篇)
- 自然资源确权登记技术规范(自然保护地)
- 十年高考物理全国卷真题(含答案)
- 2023北京朝阳初三一模数学(试卷及答案)
- 2022年 陕西延长石油集团西北橡胶有限公司招聘考试真题及答案
- 2023年江苏省中学生生物奥林匹克竞赛试题及答案
- 2023年湖南省普通高中生物学业水平考试真题汇编含答案
- 古诗词诵读课件 统编版高中语文必修下册
- 汉语拼音儿歌77首(声母打印版)A4
- 2023年华润电力社会招聘笔试参考题库附带答案详解
- 智联招聘金牌面试官课件
- 社区妇女议事会议记录(6篇)
评论
0/150
提交评论