关于高仿微信对话列表滑动删除效果代码优化

原文:http://blog.csdn.net/singwhatiwanna/article/details/17515543

最近公司项目需用到微信滑动拉出按钮的效果,发现一位牛人已经实现了相关效果,但控件仍与业务代码存有耦合,于是花了点时间做了些去耦合,并于此进行记录,以防遗忘。

个人认为耦合主要在于两点:

第一点是SlideListView中的onTouchEvent

通过获取item间接得到SlideView,但这样会引入外部数据类MessageItem。

    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {  
        case MotionEvent.ACTION_DOWN: {  
            int x = (int) event.getX();  
            int y = (int) event.getY();  
            //我们想知道当前点击了哪一行  
            int position = pointToPosition(x, y);  
            Log.e(TAG, "postion=" + position);  
            if (position != INVALID_POSITION) {  
                //得到当前点击行的数据从而取出当前行的item。  
                //可能有人怀疑,为什么要这么干?为什么不用getChildAt(position)?  
                //因为ListView会进行缓存,如果你不这么干,有些行的view你是得不到的。  
                MessageItem data = (MessageItem) getItemAtPosition(position);  
                mFocusedItemView = data.slideView;  
                Log.e(TAG, "FocusedItemView=" + mFocusedItemView);  
            }  
        }  
        default:  
            break;  
        }
        ...
    }

本人认为将以下代码

int position = pointToPosition(x, y);  
if (position != INVALID_POSITION) {   
    MessageItem data = (MessageItem) getItemAtPosition(position);  
    mFocusedItemView = data.slideView;  
}

修改为:

int position = pointToPosition(x, y);
if (position != INVALID_POSITION) {
    int firstPos = getFirstVisiblePosition();
    mSlideView = (SlideView) getChildAt(position - firstPos); 
}

即可。由于pointToPosition返回的是ListView所有item中被点击的item的position,而listview只会缓存可见的item,因此getChildAt()的时候,需要通过减去getFirstVisiblePosition()来计算被点击的item在可见items中的位置。如此则能够去掉外部数据类MessageItem给控件带来的耦合,同时MessageItem不再需要内部成员slideView。

public class MessageItem {  
   public int iconRes;  
   public String title;  
   public String msg;  
   public String time;   
}

第二点是slide_view_merge.xml中holder的宽度被固定为120dp

<?xml version="1.0" encoding="utf-8"?>
<merge 
    ...
    <RelativeLayout
        android:id="@+id/holder"
        android:layout_width="120dp"
        android:layout_height="match_parent"
        android:clickable="true"
        android:background="@drawable/holder_bg">

        ...
    </RelativeLayout>

</merge>

SlideView初始化时再次计算其宽度

SlideView.java:

private void initView() {  
        mContext = getContext();  
        // 初始化弹性滑动对象  
        mScroller = new Scroller(mContext);  
        // 设置其方向为横向  
        setOrientation(LinearLayout.HORIZONTAL);  
        // 将slide_view_merge加载进来  
        View.inflate(mContext, R.layout.slide_view_merge, this);  
        mViewContent = (LinearLayout) findViewById(R.id.view_content);  
        mHolderWidth = Math.round(TypedValue.applyDimension(  
                TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()  
                        .getDisplayMetrics()));  
}

本人顾虑(当然该顾虑可能是多余的)到按钮无法根据字体进行长度扩展,在SlideView初始化时提前计算holder可能所需的空间,确保按钮的可扩展性

修改如下:

<?xml version="1.0" encoding="utf-8"?>
<merge 
    ...
    <RelativeLayout
        android:id="@+id/holder"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:clickable="true"
        android:background="@drawable/holder_bg">

        ...
    </RelativeLayout>

</merge>

SlideView.java:

private void initView() {  
        mContext = getContext();  
        // 初始化弹性滑动对象  
        mScroller = new Scroller(mContext);  
        // 设置其方向为横向  
        setOrientation(LinearLayout.HORIZONTAL);  
        // 将slide_view_merge加载进来  
        View.inflate(mContext, R.layout.slide_view_merge, this);  
        mViewContent = (LinearLayout) findViewById(R.id.view_content);
        mHolder = (RelativeLayout) findViewById(R.id.holder);
        mHolder.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        mHolderWidth = mHolder.getMeasuredWidth();
        mHolder.setLayoutParams(new LinearLayout.LayoutParams(mHolderWidth, LayoutParams.FILL_PARENT));
}

总体来说,牛人的代码很简洁易用,很符合小弟的口味,十分感谢牛人的无私分享!

关于高仿微信对话列表滑动删除效果代码优化

时间: 2024-10-13 22:27:03

关于高仿微信对话列表滑动删除效果代码优化的相关文章

高仿微信对话列表滑动删除效果(转)

前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有.思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可.由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突,也许你需要了解下android中点击事件的派发流程,请参考Android源码分析-点击事件派发机制.我的解决思路是这样的:重写ListView的onInterceptTouchEvent方法,在move的时候做判断,如果是左右滑动就返回false,否则返

【转】高仿微信对话列表滑动删除效果--不错

原文网址:http://blog.csdn.net/singwhatiwanna/article/details/17515543 转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17515543 前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有.思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可.由于ListView是上下滑动而item是左右滑动,因

高仿微信对话列表滑动删除效果

前言 用过微信的都知道.微信对话列表滑动删除效果是非常不错的,这个效果我们也能够有. 思路事实上非常easy,弄个ListView.然后里面的每一个item做成一个能够滑动的自己定义控件就可以.由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突.或许你须要了解下android中点击事件的派发流程,请參考Android源代码分析-点击事件派发机制.我的解决思路是这种:重写ListView的onInterceptTouchEvent方法,在move的时候做推断,假设是左右滑动就返回

高仿 美团 向左滑动删除条目

1.效果图             2.功能实现 2.1 布局结构 <?xml version="1.0" encoding="UTF-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height=&quo

Android仿微信SlideView聊天列表滑动删除效果

package com.ryg.slideview; import com.ryg.slideview.MainActivity.MessageItem; //Download by http://www.okbase.net import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import andro

android高仿微信拍照、多选、预览、删除(去除相片)相册功能

先声明授人与鱼不如授人与渔,只能提供一个思路,当然需要源码的同学可以私下有偿问我要源码:QQ:508181017 工作了将近三年时间了,一直没正儿八经的研究系统自带的相册和拍照,这回来个高仿微信的拍照.多选.预览.删除(去除相片)相册功能,之前开发的所有应用都带有这需求,但是一直都不实用!废话就不多说了,先来捋一下思路: 1.拍照能实时保存到本地并实时查询(不必用广播或者服务) 2.拍照保存到到自定义路径并根据不同文件夹显示文件夹下的相片 3.多选规定张数图片 4.用到的集合有: (1).所有相

Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)

转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46453627 本文出自:[海龙的博客] 一.概述 在上一篇博文中,博文地址Android-通过SlidingPaneLayout高仿微信6.2最新版手势滑动返回(一),我们是通过官方自带的SlidingPaneLayout来实现的手势滑动返回.在这篇博文中,我们将採用SlidingMenu来高仿. 事实上实现的原理都一样.仅仅只是是把SlidingPaneLayout

Android高仿微信图片选择上传工具

源码托管地址:https://github.com/SleepyzzZ/photo-selector 话不多说,先上效果图(高仿微信图片选择器): 图片选择界面: 图片预览界面: 批量上传图片: 实现的功能介绍: 1.图片异步加载,使用Glide开源库实现加载; 2.图片的预览界面,支持左右滑动,双击放大浏览; 3.图片批量上传,使用OkHttp来实现与Servlet服务器的通信; 使用方法(Android Studio): 新建工程,File->New->Import Module导入pho

Android 高仿微信实时聊天 基于百度云推送

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:[张鸿洋的博客] 一直在仿微信界面,今天终于有幸利用百度云推送仿一仿微信聊天了~~~ 首先特别感谢:weidi1989分享的Android之基于百度云推送IM ,大家可以直接下载:省了很多事哈,本例中也使用了weidi的部分代码,凡是@author way的就是weidi1989的代码~~ 1.效果图 核心功能也就上面的两张图了~~~我拿着手机和模拟器