效果图:

布局中去指定自定义FrameLayout:

<!-- 自定义仿QQ列表Item滑动 -->
<view.custom.shangguigucustomview.MyCustomFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="80dp"
android:orientation="vertical"
tools:context=".ShangGuiguTestActivity"
android:background="@android:color/darker_gray"> <TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@android:color/white"
android:textColor="@android:color/black"
android:textSize="20dp"
android:text="你有一条消息未读"
android:gravity="center"
android:drawableLeft="@mipmap/ic_launcher_round"
android:paddingRight="40dp"
/> <TextView
android:id="@+id/tv_menu"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:background="@android:color/holo_orange_dark"
android:textColor="#f00000"
android:textSize="20dp"
android:text="删除"
android:gravity="center"
android:paddingLeft="30dp"
android:paddingRight="30dp"
/> </view.custom.shangguigucustomview.MyCustomFrameLayout>

自定义FrameLayout:

public class MyCustomFrameLayout extends FrameLayout { // 继承于FrameLayout属于继承ViewGroup,因为它包含了孩子

    private static final String TAG = MyCustomFrameLayout.class.getSimpleName();

    /**
* 拿到两个控件的宽和三个的高
* @param context
* @param attrs
*/
private int myHeigth; // 统一的高度
private int myContentWidth; // 中间内容TextView的宽度
private int myMenuWidth; // 菜单的宽度 private Scroller scroller; public MyCustomFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs); scroller = new Scroller(context);
} private View tvContent;
private View tvMenu; /**
* 当布局加载完成✅后就会回调此方法
*/
@Override
protected void onFinishInflate() {
super.onFinishInflate(); tvContent = getChildAt(0); // 拿到第一个孩子
tvMenu = getChildAt(1); // 得到第二个孩子
} /**
* 测量两个孩子的高宽
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec); myContentWidth = tvContent.getMeasuredWidth(); // 等价于getMeasuredWidth();因为这个是后去父控件的宽度,父控件和这个孩子控件宽度是一样的
myHeigth = getMeasuredHeight();
myMenuWidth = tvMenu.getMeasuredWidth();
} /**
* 为何不让实现者强制重写,应该在FrameLayout中已经重写过了
* @param changed
* @param left
* @param top
* @param right
* @param bottom
*/
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom); // 指定位置
tvContent.layout(0, 0, myContentWidth, myHeigth);
tvMenu.layout(myContentWidth, 0 , myContentWidth + myMenuWidth, myHeigth);
} private float startX;
private int x; @Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX = event.getX();
break;
case MotionEvent.ACTION_UP:
float upEnd = event.getX();
float thisUp = upEnd;
// float myx = getScrollX() - thisUp;
if (getScrollX() > myMenuWidth / 2) {
// x = myMenuWidth; openM();
} else {
// x = 0; closeM();
}
/*invalidate();
scroller.startScroll(getScrollX(), getScrollY(), x, Math.abs(1000));*/
// scrollTo(x, getScrollY());
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) event.getX();
int thisX = (int) (endX - startX); int scrollX = getScrollX();
Log.i(TAG, ">>>>> scrollX" + scrollX); x = scrollX - thisX; // 非法值的屏蔽
if (x < 0) {
x = 0;
} else if (x > myMenuWidth) {
x = myMenuWidth;
} scrollTo(x, getScrollY()); startX = event.getX(); break;
default:
break;
}
return true;
} private void openM() {
invalidate();
int dx = myMenuWidth - getScrollX();
scroller.startScroll(getScrollX(), getScrollY(), dx, Math.abs(1000));
} private void closeM() {
invalidate();
int dx = 0 - getScrollX();
scroller.startScroll(getScrollX(), getScrollY(), dx, Math.abs(1000));
} @Override
public void computeScroll() {
super.computeScroll(); if (scroller.computeScrollOffset()) {
int currX = scroller.getCurrX();
scrollTo(currX, 0);
invalidate();
}
}
}

Android-自定义仿QQ列表Item滑动的更多相关文章

  1. Android 高仿QQ滑动弹出菜单标记已读、未读消息

    在上一篇博客<Android 高仿微信(QQ)滑动弹出编辑.删除菜单效果,增加下拉刷新功能>里,已经带着大家学习如何使用SwipeMenuListView这一开源库实现滑动列表弹出菜单,接 ...

  2. 自定义仿 QQ 健康计步器进度条

    自定义仿 QQ 健康计步器进度条 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 闲着没事,趁上班时间偷偷撸了 ...

  3. jQuery实现的3个基础案例(仿QQ列表分组,二级联动下拉框,模拟员工信息管理系统)

    1.仿QQ列表分组 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&quo ...

  4. Android高仿qq及微信底部菜单的几种实现方式

    最近项目没那么忙,想着开发app的话,有很多都是重复,既然是重复的,那就没有必要每次都去写,所以就想着写一个app通用的基本框架,这里说的框架不是什么MVC,MVP,MVVM这种,而是app开发的通用 ...

  5. 仿QQ列表左滑删除

    一直想写个仿QQ通讯列表左滑删除的效果,今天终于忙里偷闲,简单一个. 大概思路是这样的: 通过 ontouchstartontouchmoveontouchend 结合css3的平移. 不多说,直接上 ...

  6. [Phonegap+Sencha Touch] 移动开发72 List列表横向滑动操作(仿QQ列表滑动删除)

    原文链接:http://blog.csdn.net/lovelyelfpop/article/details/50425744 本插件有2个版本号:sencha touch 版本号和 extjs6 m ...

  7. 模仿qq列表信息滑动删除效果

    这个效果的完成主要分为两个部分 自定义view作为listview的列表项 一个view里面包括 显示头像,名字,消息内容等的contentView和滑动才能显示出来的删除,置顶的右边菜单menuVi ...

  8. Android自定义组件——四个方向滑动的菜单实现

    今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静 ...

  9. Android实现仿qq侧边栏效果

    最近从github上看到一个关于侧边栏的项目,模仿的是qq侧边栏. Github地址是https://github.com/SpecialCyCi/AndroidResideMenu ,这个项目是一个 ...

随机推荐

  1. 单链表LRU

    单链表实现lru 越靠近链表尾部的节点是越早之前访问的 当有一个新的数据被访问时,从链表头开始顺序遍历链表 1.如果此数据之前已经被缓存在链表中 遍历得到这个数据对应的节点,并将其从原来的位置删除,然 ...

  2. win10开启开发人员模式

    工具: win10 方法如下: 1.在Windows10系统桌面,点击开始菜单,然后在弹出窗口中选择“设置”菜单项 2.在打开的设置窗口中,选择“更新和安全”图标,并点击打开更新和安全窗口 3.在打开 ...

  3. pandas的数据结构

    要使用pandas,需要熟悉它的两个主要的数据结构,Series和DataFrame. Series series是一种类似于以为数组的对象,它由一组数据(各种numpy的数据类型)以及一组与之相关的 ...

  4. [代码][deque容器练习]打分案例

    案例要求: //打分案例(sort算法排序)//创建5个选手(姓名.得分),十个评委对五个选手进行打分//得分规则:去除最高分,去除最低分,取出平均分//按得分对5个选手进行排名 源代码: //打分案 ...

  5. TBitConverter

    TBitConverter FromBcd  FromByte  FromCurrency  FromDouble  FromExtended  FromInteger  FromLargeInt   ...

  6. delphi 工具

    http://blog.csdn.net/maxwoods/article/category/1285993

  7. JAXB--@XmlElementWrapper注解(二)

    在JAXB标准中,@XmlElementWrapper注解表示生成一个包装 XML 表示形式的包装器元素. 此元素主要用于生成一个包装集合的包装器 XML 元素.因此,该注释支持以下两种形式的序列化. ...

  8. 【332】Machine Learning

    Reference: 决策树方法-对买电脑进行分类预测 Reference: 最邻近规则分类(K-Nearest Neighbor)KNN算法应用 Reference: python 内建函数 str ...

  9. 转化RGB颜色为CMYK颜色

    procedure RGBTOCMYK(R : byte; G : byte; B : byte; var C : byte; var M : byte; var Y : byte; var K : ...

  10. 前端开发之jQuery属性和文档操作

    主要内容: 1.jQuery属性操作 2.jQuery文档操作 一.jQuery属性操作 1.什么是jQuery的属性操作? jQuery的属性操作模块包括四个部分:html属性操作,dom属性操作, ...