效果图:

布局中去指定自定义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. 黄聪:定制化WordPress后台自定义仪表盘

    WordPress作为一博客管理系统,相对来说已经相当简洁了,对用户也十分友好,新手也极易上手. 仪表盘是我们登陆WordPress后看到的后台界面,映入眼帘的是各种各样的信息,如WordPress ...

  2. Bootstrap-CL:略缩图

    ylbtech-Bootstrap-CL:略缩图 1.返回顶部 1. Bootstrap 缩略图 本章将讲解 Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstr ...

  3. sqlnet.ora限制客户端IP访问

    实现功能: 只允许某几个IP访问数据库服务端(白名单): $ORACLE_HOME/network/admin/sqlnet.ora 添加2个主要参数 TCP.VALIDNODE_CHECKING=y ...

  4. solr跨core查询

    参考文档:这里的跨core不使用solrcloud http://wiki.apache.org/solr/CoreAdmin 注意:跨core查询功能相比单core查询,是有限制的   只需要在ur ...

  5. 接口自动化(三)--读取json文件中的数据

    上篇讲到实际的请求数据放置在json文件内,这一部分记述一下python读取json文件的实现. 代码如下(代码做了简化,根据需要调优:可做一些容错处理): 1 import json 2 3 cla ...

  6. ES6系列_13之Proxy进行预处理(简单学习)

    1.理解什么是预处理? 当我们在操作一个对象或者方法时会有几种动作,比如:在运行函数前初始化一些数据,在改变对象值后做一些善后处理.这些都算钩子函数,Proxy的存在就可以让我们给函数加上这样的钩子函 ...

  7. POI 3.17

    发现与之前使用的有些不同 参考:https://www.cnblogs.com/h--d/p/6735110.html

  8. react-navigation 3.x版本的使用

    安装配置请看: react-navigation 3.x版本的安装以及react-native-gesture-handler配置 2.0以前版本: StackNavigator - 一次只渲染一个页 ...

  9. Ice_cream’s world II(最小树形图,加虚点)

    Ice_cream’s world II http://acm.hdu.edu.cn/showproblem.php?pid=2121 Time Limit: 3000/1000 MS (Java/O ...

  10. MongoDB增加用户认证: 增加用户、删除用户、修改用户密码、读写权限、只读权限

    1.添加并验证用户 > use admin> db.addUser("zjx","tsjianxin") #添加用户 > db.auth(&q ...