【移动应用开发技术】怎么在Android应用中利用onTouchEvent实现一个滑动布局_第1页
【移动应用开发技术】怎么在Android应用中利用onTouchEvent实现一个滑动布局_第2页
【移动应用开发技术】怎么在Android应用中利用onTouchEvent实现一个滑动布局_第3页
【移动应用开发技术】怎么在Android应用中利用onTouchEvent实现一个滑动布局_第4页
【移动应用开发技术】怎么在Android应用中利用onTouchEvent实现一个滑动布局_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论