贵州做网站公司
贵州做网站公司~专业!靠谱!
10年网站模板开发经验,熟悉国内外开源网站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等网站程序,可为您提供网站建设,网站克隆,仿站,网页设计,网站制作,网站推广优化等服务。我们专注高端营销型网站,企业官网,集团官网,自适应网站,手机网站,网络营销,网站优化,网站服务器环境搭建以及托管运维等。为客户提供一站式网站解决方案!!!

onfinishinflate(Android中怎么实现条目拖拽删除功能)

来源:网络转载 时间:2024-05-08 14:36:00

第一步效果图

1.0自定义控件 SwipeLayout 继承FrameLayout重写里面三个构造方法,分别调用initView().

2.0在布局中使用自定义控件

3.0在initView()方法中,创建拖拽辅辅助工具 ViewDragHelper()

该方法需要传入回调 MyCallBack()

4.0,创建MyCallBack()回调,继承ViewDragHelper.Callback

在回调中 覆盖tryCaptureView方法,返回true 允许child被拖拽,被 覆盖clampViewPositionHorizontal 返回left系统提供拖拽位置

5.0 onInterceptTouchEvent 返回:让ViewDragHelper判断是否需要拦截事件

6.0 onTouchEvent 返回true 并且让ViewDragHelper分析事件

具体代码:

布局:

<cn.itheima.swipelayout.SwipeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="wrap_content"><!--正文部分--><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#fff"android:orientation="horizontal"><TextViewandroid:id="@+id/item_tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:text="张三"android:textSize="20sp"/></RelativeLayout><!--按钮部分--><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#888888"android:padding="10dp"android:text="呼叫"android:textSize="20sp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#f00"android:padding="10dp"android:text="删除"android:textSize="20sp"/></LinearLayout></cn.itheima.swipelayout.SwipeLayout>

SwipeLayout 代码:

publicclassSwipeLayoutextendsFrameLayout{privateViewDragHelpermDragHelper;publicSwipeLayout(Contextcontext){super(context);initView();}publicSwipeLayout(Contextcontext,attributesetattrs){super(context,attrs);initView();}publicSwipeLayout(Contextcontext,AttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);initView();}privatevoidinitView(){mDragHelper=ViewDragHelper.create(this,newMyCallBack());}//让ViewDragHelper就是拖拽辅助工具返回true则表示要拦截触摸事件@OverridepublicbooleanonInterceptTouchEvent(MotionEventev){//让拖拽辅助工具判断是否需要拦截事件returnmDragHelper.shouldInterceptTouchEvent(ev);}@OverridepublicbooleanonTouchEvent(MotionEventevent){//让拖拽辅助工具分析事件分析用户手势mDragHelper.processTouchEvent(event);returntrue;}privateclassMyCallBackextendsViewDragHelper.Callback{/***如果返回true则表示child允许被拖拽*/@OverridepublicbooleantryCaptureView(Viewchild,intpointerId){returntrue;}/***固定被拖拽控件的水平位置,*参数里的left是系统推荐移动到的位置,可以进行修正,*方法返回的值就是child将要移动到的位置*/@OverridepublicintclampViewPositionHorizontal(Viewchild,intleft,intdx){returnleft;}}}

第二步:

1.0创建onfinishinflate方法获取子控件,并且判断健壮性

/*控件初始化时执行,可以用于获取子控件*/@OverrideprotectedvoidonFinishInflate(){//健壮性检查if(getchildCount()!=2){thrownewRuntimeException("SwipeLayout必须存放两个子控件");}if(!(getChildAt(0)instanceofViewGroup)||!(getChildAt(1)instanceofViewGroup)){thrownewRuntimeException("SwipeLayout的子控件必须是ViewGroup");}mContent=(ViewGroup)getChildAt(0);mDeletePanel=(ViewGroup)getChildAt(1);}

2.0创建onSizeChanged方法,在控件大小改变的时候调用,获取控件的宽高,和删除的面板的最大移动范围

/***当控件大小改变的时候调用这个方法*/@OverrideprotectedvoidonSizeChanged(intw,inth,intoldw,intoldh){super.onSizeChanged(w,h,oldw,oldh);intmWith=w;intmHeigth=h;//界面创建过程中,不能使用getWidth方法intmRang=mDeletePanel.getMeasuredWidth();}

3.0在onLayout中指定侧拉面板的位置

//指定侧拉面板的位置@OverrideprotectedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom){super.onLayout(changed,left,top,right,bottom);mDeletePanel.layout(mWith,0,mWith+mRang,mHeigth);}

4.0在onViewPositionChanged方法中实现联动效果

/***当被拖拽的控件已经移动过后,会调用这个方法,可以用于处理控件间的联动效果*@left被拖拽控件的真实移动位置*@dx被拖拽控件的真实偏移大小*/@OverridepublicvoidonViewPositionChanged(ViewchangedView,intleft,inttop,intdx,intdy){if(changedView==mContent){//移动正文的同时也要移动侧栏mDeletePanel.offsetLeftAndRight(dx);}else{mContent.offsetLeftAndRight(dx);}}

5.0在 clampViewPositionHorizontal方法中 固定被拖拽控件的水平位置,

/***固定被拖拽控件的水平位置,*参数里的left是系统推荐移动到的位置,可以进行修正,*方法返回的值就是child将要移动到的位置*/@OverridepublicintclampViewPositionHorizontal(Viewchild,intleft,intdx){if(child==mContent){if(left>0){left=0;}elseif(left<-mRang){left=-mRang;}}else{if(left>mWith){//mWith是屏幕的宽度left=mWith;}elseif(left<mWith-mRang){left=mWith-mRang;}}returnleft;}

第三步:

效果图

1.0onViewReleased中根据来开局里面,判断是否打开还是关闭

2.0 在 moveContent中第一次滑动

3.0computeScroll中,继续滑动,直到滑动到指定的位置

4.0注意在onViewPositionChanged中手动刷新界面,调用invalidate方法

如果不手动刷新界面,效果展示不出来

/***当用户松手时执行*@xvel松手时在X方向的移动速度,如果为正数则说明是向右移动,如果是负数则说明是向左移动,如果为零,说明是静止状态*/@OverridepublicvoidonViewReleased(Viewreleasedchild,floatxvel,floatyvel){if(xvel>0){//向右移动close();}elseif(xvel<0){//向左移动opend();}elseif(xvel>-mRang/2){//静止状态close();//展开不到一半,关闭面板}else{opend();}}}/***打开面板*/privatevoidopend(){intleft=-mRang;moveContent(left);}/***关闭面板*/privatevoidclose(){intleft=0;moveContent(left);}privatevoidmoveContent(intleft){//开启平滑滚动,如果返回true则说明要继续刷新界面,保持滚动if(mDragHelper.smoothSlideViewTo(mContent,left,0)){invalidate();}}@OverridepublicvoidcomputeScroll(){//继续平滑滚动,如果返回true则说明要继续刷新界面,保持滚动if(mDragHelper.continueSettling(true)){invalidate();}}

第四步:

1.0现给ListView赋值 在这就省略

2.0在SwipeLayout中使用枚举记录面板的状态

privateenumStatus{CLOSED,OPENED,DRAGING;}privateStatusstatus=Status.CLOSED;publicStatusgetStatus(){returnstatus;}

3.0// 记录上一个打开的面板。注意:一定要是 静态变量

privatestaticSwipeLayoutpreSwipeLayout;

4.0在onViewPositionChanged中创建一个方法操作关闭面板

//关闭上一个打开的面板closePre();

5.0closePre()在这个方法中,判断当前面板的状态,并且根据状态,关闭上一个打开的面板

//判断当前面板是否正在打开,如果正在打开则将上一个打开的面板关闭privatevoidclosePre(){//记录旧状态StatuspreStatus=status;if(mContent.getLeft()==-mRang){//记录当前面板已经打开status=status.OPENED;}elseif(mContent.getLeft()==0){//当前面板已经关闭status=status.CLOSED;}else{status=status.DRAGING;}//如果当前面板旧状态为关闭,并且新状态为拖拽,那么此时可以关闭之前打开的面板if(preStatus==status.CLOSED&&status==status.DRAGING){if(preSwipeLayout!=null&&preSwipeLayout!=this){//关闭上一个面板preSwipeLayout.close();}//将当前面板标记为打开的面板preSwipeLayout=this;}}

以上就是Android中怎么实现条目拖拽删除功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注本站行业资讯频道。

标签:onfinishinflate-

外卖点餐小程序开发的确在一些程度是优于美团、饿了么等平台,很多商家关心外卖点餐小程序开发价格,其价格只能做一个大概的估算。决定外卖点餐小程序开发价格的核心因素是...

  小程序的快速发展速度目前无人能及,自从2017年1月正式上线开始,到今天已经有了超过用户规模已达6亿,快速裂变让它的功能展示在人们的眼前,带动微信走上了顶峰...

  微信早前仅仅是一个社交平台,主要经营着用户之间的联络,但是伴随着微信支付、城市生活服务等各方面功能的开放,微信已经变成了我们生活中不可或缺的一部分。现在微信...

利息调整怎么理解?通常情况下,我们说的利息调整指的是,按实际本金和实际利率计算的利息与按票面面值和票面利率计算的利息的差额。通俗的来说就是,实际利率和票面利率之前的差额。简单来说,利息调整的计算依据就是根据实际利率下的摊余成本法来计算的。利息变动调整方式在降息或者加息的情况下,房贷利率调整有三种方式:1、一种是次年调,银行利率调整后,次年1月1日开始执行新利率;2、一种是按年度调,从贷款人的贷款日...

权证交易指的是什么?权证交易指的是持有人获取的是一个权利,而不是责任,受人有权利决定是否履行契约,而发行人只有被执行的义务,因此为获得这一项权利投资人需要付出一定的代价,权证和怨气或者是期货的主要分别就是在于前者持有人获得的不是一种责任而是一种权利,后者持有人需要有责任执行双方签订的买卖合约,也就是必须以一个指定的价格在指定的未来时间交易指定的相关资产,而这种交易被称之为权证交易。权证的起源与发展...

a股单日最大跌幅是哪一天?1996年12月16日,沪深两交易所发出通知,决定自16日起对在两交易所上市和交易的股票(含A、B股)和基金类证券的交易价格实行10%的涨跌幅限制。当时大盘连续暴跌4天,其中两天的跌幅是5.44%,5.70%,9.91%,9.44%。2007年2月27日,A股各指数跌幅均超过8%,其中上证综指和深成指创近10年最大单日跌幅,分别为8.84%和9.29%。两市1327只可交...

TOP