效果图:

布局中去指定自定义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. 事务的ACID和四个隔离级别

    在实际的业务场景中,并发读写引出了和事务控制的需求.优秀的事务处理能力是关系型数据库(特别是oracle等商用RDBMS)相对于正当风口的NoSQL数据库的一大亮点.但这也从另一方面说明了事务控制的复 ...

  2. jquery选择器用法

    jquery的基础选择器 选择器的用法其实跟咱们当时讲css的选择器用法类似,只是代码书写的不同 <ul> <li id="brother" class=&quo ...

  3. 关闭 iTunes 自动同步

    关闭 iTunes 自动同步 iTunes>Edit>perererset>device>Prevent iPods,iPhone, and iPads from syncin ...

  4. OleVariant Variant

    OleVariant ArrayDimCount OleVariant; System.Variants.hpp   判断OleVariant 是否为空 System::OleVariant ov i ...

  5. URL的名称设置

    1. 对于login.html 此为跳转文件, 加入了参数nid,在views.py中进行关于request.POST.get()的文件中获取 <a href='/detail?nid={{k} ...

  6. linux img文件 分区挂载

    首先是将制作的img文件比如hd5.img和loop设备建立联系. losetup /dev/loop0 hd5.img 然后用fdisk分区:fdisk /dev/loop0 mkfs.ext4 / ...

  7. springmvc 类型转换器 数据回显及提示信息

    处理器的写法: 类型转换器的写法: 类型转换器在springmvc.xml中的配置如下: index.jsp的写法:

  8. Docker构建redis cluster集群

    准备工作 安装gcc ruby 解压编译redis Redis 是 c 语言开发的.安装 redis 需要 c 语言的编译环境.如果没有 gcc 需要在线安装. yum install gcc-c++ ...

  9. 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)

    目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...

  10. 21.Merge Two Sorted Lists (List)

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...