Android-自定义仿QQ列表Item滑动

效果图:

布局中去指定自定义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();
        }
    }
}

原文地址:https://www.cnblogs.com/android-deli/p/9661658.html

时间: 2024-10-10 09:44:44

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

Android高仿QQ消息滑动删除(附源码)

大家都应该使用过QQ吧,他的消息中可以滑动删除功能,我觉得比较有意思,所以模仿写了一个,并且修改了其滑动算法.我先贴几个简单示范图吧 其实主要用的是算法以及对ListView的把控. 一下是适配器的类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

android实现仿QQ界面刷新

android实现仿QQ界面刷新 转载请注明出处:http://blog.csdn.net/wangpengfei_p/article/details/51420422 昨天想要实现一个下拉刷新的效果,本来想应该比较简单,因为之前在慕课网看见过类似的实现,记得是在listView里面添加footView或是添加headView,监听手指的点击滑动事件来控制view的显示或是隐藏,但是自己按照上面的代码来实现之后发现.这样做有一点不好的地方: 它判断是否刷新的依据是判断listView是不是滑动到

分享一个Android版 仿QQ局域网即时通信软件(可发文件、语音、录音)

一.支持的功能有文字信息交互.语音聊天.发送文件和录音 源码会在后面附上. 二.UI展示图 三.经过我的测试,是非常成功的.只是有一点不足就是语音实时通话的时候声音会回声甚至死机. 文件传送和文字,录音都比较成功. 四.本软件是用Java编码,在安卓平台上的应用.使用了UDP协议和TCP协议. 大家可以学习这两部分的代码. 里面注释还是比较多. 五.当然我只是个学生,这个只是学生版本,仅供大家学习借鉴之用.绝对不能用于商业拿去直接卖,或者改改就上架某市场. 六.宣传下本人的小制作: 单机斗地主-

Android超高仿QQ附近的人搜索展示

如果我有机器猫 我要叫他小叮当 ~开车~~ 版权所有,转载请注明:http://blog.csdn.net/mr_immortalz/article/details/51319354 最近无意中发现了QQ群有查看附近的人的效果,感觉挺棒的,约炮神器有木有! 效果这么酷,网上有没有呢?木有!好吧,作为程序猿还是老老实实苦逼的撸吧. 1.概述 老规矩,先上图,再扯蛋(额,不对-) 这个就是我们撸出来的效果,原谅画质哈 (小米手机miui7不能用小米助手,所以录gif挺麻烦了) 原装货(就不录制gif

Android自定义view 滑动开关 支持左右滑动 适用于listview

要做这样一种开关. 当开关在左边时,都是灰色的,向右滑动的时候,滑到一半的时候,改变颜色,变成绿色: 当开关在右边是,都市绿色的,向左滑动的时候,滑动一半的时候,改变颜色,变成灰色. 这里就要涉及要可滑动最大距离,以及你现在滑动的距离.通过这个来比较,改变颜色. import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.

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

今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静态图片吧,实际效果可以下载源代码查看) (向上滑动) (向下滑动) (向左滑动) (向右滑动) 二.实现过程介绍 1.放置5个View (分别是上下左右中) @Override protected void onLayout(boolean changed, int l, int t, int r,

Android 自定义ListView控件,滑动删除

1.触摸事件 dispatchTouchEvent 判断是否处理触摸动作 onTouchEvent 处理触摸动作 2.Android对于控制和获取View在屏幕很强大 ListView: pointToPosition 根据触摸点获取item的位置 getChildAt 根据索引获取item的View,注意从第一个可视化的item算起 View: getLocationOnScreen获取View在屏幕的坐标 import android.content.Context; import andr

Android实现仿qq侧边栏效果

最近从github上看到一个关于侧边栏的项目,模仿的是qq侧边栏. Github地址是https://github.com/SpecialCyCi/AndroidResideMenu ,这个项目是一个android studio项目,可以导入android studio中,也可以导入到Eclipse中. 其中的ResideMenu就是写好的第三方控件,可以拿过来直接用.我们主要来看一下它是如何来运用的 public class MenuActivity extends FragmentActiv

Android自定义类似于QQ的消息提示框

看到QQ的信息提示框,感觉效果很不错,做了一个类似的,展示如下: 点击查看短视频 效果还不错,整体上是Translate动画和FrameLayout布局的结合,下面看一下代码: activiy_main.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51