android自定义View之自定义侧滑删除效果

android自定义View之滑动删除 效果图实现功能1,可以向左滑动,右侧出现删除 2,向左滑动如果删除出现一大半,松手打开删除,反之关闭删除 3,应用场景 微信消息的删除功能 实现原理1,外面是一个ListView 2,条目是一个自定义控件继承ViewGroup 1,左边一个TextView,右侧屏幕外也有一个TextView 2,所以继承ViewGroup 实现步骤1,创建一个SlideDeleteView类 阅读详情

文章转载自http://blog.youkuaiyun.com/sinat_27681957/article/details/51854525

最近在研究自定义View,想到了之前想研究的侧滑删除.于是..

先上效果图



思路是这样的:

1:首先先说一下item:item用的LinearLayout布局,删除、编辑分别是写死了宽度的TextView,左边是一个match_parent的RelativeLayout,内容自己随意搞

2:上下滑动和左右滑动的处理:当用户手指滑动时,可以进行坐标的判断,如果Y轴移动距离大,则listview上下滑动;否则当X轴移动距离达到或者超过一个TextView的宽度时,动态控制item的marginLeft为负的两倍TextView的宽度,从而实现滑动效果

3:编辑、删除的点击:编辑、删除在adapter中进行监听,然后自己在adapter中再定义一个监听接口,方便用户在使用listview的activity中进行监听


首先,自定义SlideListView

package com.jxy.swipe;

/**
 * Created by JinXinYi on 2017/2/9.
 */
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.ListView;

public class SlideListView extends ListView {
    private int mScreenWidth;   // 屏幕宽度
    private int mDownX;         // 按下点的x值
    private int mDownY;         // 按下点的y值
    private int mDeleteBtnWidth;// 删除按钮的宽度

    private boolean isDeleteShown;  // 删除按钮是否正在显示

    private ViewGroup mPointChild;  // 当前处理的item
    private LinearLayout.LayoutParams mLayoutParams;    // 当前处理的item的LayoutParams

    public SlideListView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SlideListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        // 获取屏幕宽度
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        mScreenWidth = dm.widthPixels;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                performActionDown(ev);
                break;
            case MotionEvent.ACTION_MOVE:
                return performActionMove(ev);
            case MotionEvent.ACTION_UP:
                performActionUp();
                break;
        }

        return super.onTouchEvent(ev);
    }

    // 处理action_down事件
    private void performActionDown(MotionEvent ev) {
        if(isDeleteShown) {
            turnToNormal();
        }

        mDownX = (int) ev.getX();
        mDownY = (int) ev.getY();
        // 获取当前点的item
        mPointChild = (ViewGroup) getChildAt(pointToPosition(mDownX, mDownY)
                - getFirstVisiblePosition());
        // 获取删除按钮的宽度
        mDeleteBtnWidth = mPointChild.getChildAt(1).getLayoutParams().width;
        mLayoutParams = (LinearLayout.LayoutParams) mPointChild.getChildAt(0)
                .getLayoutParams();
        mLayoutParams.width = mScreenWidth;
        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }

    // 处理action_move事件
    private boolean performActionMove(MotionEvent ev) {
        int nowX = (int) ev.getX();
        int nowY = (int) ev.getY();
        if(Math.abs(nowX - mDownX) > Math.abs(nowY - mDownY)) {
            // 如果向左滑动
            if(nowX < mDownX) {
                // 计算要偏移的距离
                int scroll = (nowX - mDownX) / 2;
                // 如果大于了删除按钮的宽度, 则最大为删除按钮的宽度
                if(-scroll >= mDeleteBtnWidth) {
                    scroll = -mDeleteBtnWidth;
                }
                // 重新设置leftMargin
                mLayoutParams.leftMargin = scroll*2;
                mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
            }
            return true;
        }
        return super.onTouchEvent(ev);
    }

    // 处理action_up事件
    private void performActionUp() {
        // 偏移量大于button的一半,则显示button
        // 否则恢复默认
        if(-mLayoutParams.leftMargin >= mDeleteBtnWidth / 2) {
            mLayoutParams.leftMargin = -mDeleteBtnWidth*2;
            isDeleteShown = true;
        }else {
            turnToNormal();
        }

        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }
    /**
     * 变为正常状态
     */
    public void turnToNormal() {
        mLayoutParams.leftMargin = 0;
        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
        isDeleteShown = false;
    }
    /**
     * 当前是否可点击
     * @return 是否可点击
     */
    public boolean canClick() {
        return !isDeleteShown;
    }


}

适配器Adapter代码:

package com.jxy.swipe;

/**
 * Created by JinXinYi on 2017/2/9.
 */
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.ListView;

public class SlideListView extends ListView {
    private int mScreenWidth;   // 屏幕宽度
    private int mDownX;         // 按下点的x值
    private int mDownY;         // 按下点的y值
    private int mDeleteBtnWidth;// 删除按钮的宽度

    private boolean isDeleteShown;  // 删除按钮是否正在显示

    private ViewGroup mPointChild;  // 当前处理的item
    private LinearLayout.LayoutParams mLayoutParams;    // 当前处理的item的LayoutParams

    public SlideListView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SlideListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        // 获取屏幕宽度
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        mScreenWidth = dm.widthPixels;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                performActionDown(ev);
                break;
            case MotionEvent.ACTION_MOVE:
                return performActionMove(ev);
            case MotionEvent.ACTION_UP:
                performActionUp();
                break;
        }

        return super.onTouchEvent(ev);
    }

    // 处理action_down事件
    private void performActionDown(MotionEvent ev) {
        if(isDeleteShown) {
            turnToNormal();
        }

        mDownX = (int) ev.getX();
        mDownY = (int) ev.getY();
        // 获取当前点的item
        mPointChild = (ViewGroup) getChildAt(pointToPosition(mDownX, mDownY)
                - getFirstVisiblePosition());
        // 获取删除按钮的宽度
        mDeleteBtnWidth = mPointChild.getChildAt(1).getLayoutParams().width;
        mLayoutParams = (LinearLayout.LayoutParams) mPointChild.getChildAt(0)
                .getLayoutParams();
        mLayoutParams.width = mScreenWidth;
        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }

    // 处理action_move事件
    private boolean performActionMove(MotionEvent ev) {
        int nowX = (int) ev.getX();
        int nowY = (int) ev.getY();
        if(Math.abs(nowX - mDownX) > Math.abs(nowY - mDownY)) {
            // 如果向左滑动
            if(nowX < mDownX) {
                // 计算要偏移的距离
                int scroll = (nowX - mDownX) / 2;
                // 如果大于了删除按钮的宽度, 则最大为删除按钮的宽度
                if(-scroll >= mDeleteBtnWidth) {
                    scroll = -mDeleteBtnWidth;
                }
                // 重新设置leftMargin
                mLayoutParams.leftMargin = scroll*2;
                mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
            }
            return true;
        }
        return super.onTouchEvent(ev);
    }

    // 处理action_up事件
    private void performActionUp() {
        // 偏移量大于button的一半,则显示button
        // 否则恢复默认
        if(-mLayoutParams.leftMargin >= mDeleteBtnWidth / 2) {
            mLayoutParams.leftMargin = -mDeleteBtnWidth*2;
            isDeleteShown = true;
        }else {
            turnToNormal();
        }

        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }
    /**
     * 变为正常状态
     */
    public void turnToNormal() {
        mLayoutParams.leftMargin = 0;
        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
        isDeleteShown = false;
    }
    /**
     * 当前是否可点击
     * @return 是否可点击
     */
    public boolean canClick() {
        return !isDeleteShown;
    }


}

activity_main的代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.jxy.swipe.MainActivity">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="20sp"
        android:text="title" />

    <com.jxy.swipe.SlideListView
        android:id="@+id/list"
        android:layout_below="@+id/tvTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </com.jxy.swipe.SlideListView>
</RelativeLayout>


ListView的item的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:orientation="horizontal">

        <RelativeLayout
            android:id="@+id/rlTop"
            android:layout_width="match_parent"
            android:layout_height="65dp"
            android:padding="10dp">
            <ImageView
                android:id="@+id/imgLamp"
                android:layout_alignParentLeft="true"
                android:layout_marginLeft="10dp"
                android:src="@mipmap/ic_launcher"
                android:layout_width="40dp"
                android:layout_height="40dp"/>
            <TextView
                android:id="@+id/tvName"
                android:layout_width="wrap_content"
                android:layout_height="22dp"
                android:layout_toRightOf="@+id/imgLamp"
                android:layout_marginLeft="10dp"
                android:gravity="center"
                android:textSize="17sp"
                android:textColor="#000000" />

            <TextView
                android:id="@+id/tvContent"
                android:layout_width="wrap_content"
                android:layout_height="18dp"
                android:layout_toRightOf="@+id/imgLamp"
                android:layout_below="@+id/tvName"
                android:layout_marginLeft="10dp"
                android:gravity="center"
                android:textSize="14sp"
                android:textColor="#000000"
                android:text="content"/>
        </RelativeLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_below="@+id/rlTop"
            android:background="#EEEEEE"/>

    </RelativeLayout>

    <!--Edit-->
    <TextView
        android:id="@+id/tvEdit"
        android:layout_width="80dp"
        android:layout_height="match_parent"
        android:background="#dddddd"
        android:gravity="center"
        android:paddingLeft="20dp"
        android:layout_marginBottom="1dp"
        android:textColor="@android:color/white"
        android:paddingRight="20dp"
        android:text="编辑" />

    <!--delete-->
    <TextView
        android:id="@+id/delete"
        android:layout_width="80dp"
        android:layout_height="match_parent"
        android:background="#FFFF0000"
        android:gravity="center"
        android:paddingLeft="20dp"
        android:layout_marginBottom="1dp"
        android:textColor="@android:color/white"
        android:paddingRight="20dp"
        android:text="删除" />
</LinearLayout>

最后附上MainActivity的代码:

import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.widget.Toast;  
import java.util.ArrayList;  
import java.util.List;  
  
public class MainActivity extends AppCompatActivity {  
    private SlideListView listView;  
    private List<String> list=new ArrayList<String>();  
    private ListViewSlideAdapter listViewSlideAdapter;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        getData();  
        initView();  
    }  
  
    private void initView(){  
        listView=(SlideListView)findViewById(R.id.list);  
        listViewSlideAdapter=new ListViewSlideAdapter(this,list);  
        listView.setAdapter(listViewSlideAdapter);  
        listViewSlideAdapter.setOnClickListenerEditOrDelete(new ListViewSlideAdapter.OnClickListenerEditOrDelete() {  
            @Override  
            public void OnClickListenerEdit(int position) {  
                Toast.makeText(MainActivity.this, "edit position: " + position, Toast.LENGTH_SHORT).show();  
            }  
  
            @Override  
            public void OnClickListenerDelete(int position) {  
                Toast.makeText(MainActivity.this, "delete position: " + position, Toast.LENGTH_SHORT).show();  
            }  
        });  
    }  
  
    private void getData(){  
       for (int i=0;i<20;i++){  
           list.add(new String("第"+i+"个item"));  
       }  
    }  
}  

就是这样啦.




2024新版客服系统源码:消息预知与已读未读功能实现及搭建教程 在客服系统开发中,实时消息推送与状态回执是提升服务效率的关键技术。WebSocket作为全双工通信协议,为消息预知(输入状态提示)和已读未读功能提供了底层支持。通过长连接,访客输入时即可实时通知客服端,减少等待;消息回执机制则让双方明确信息送达状态,增强信任感。这类功能广泛应用于电商售前、技术支持等在线咨询场景,也是开源客服系统源码的高频需求点。本文从实时通信原理出发,解析消息预知与已读未读的实现方案、数据库设计及前端降级策略,并结合2024新版客服系统源码,完整演示从服务器环境配置、WebSocket服务 阅读详情

相关推荐

仿淘宝ViewPager左滑查看详情

难解决的是事件冲突,这个自定义布局可包含多个直接子控件,在该布局下,停止状态时,同一时刻只能显示一个直接子控件,滑动时可像ViewPager一样 即该布局可左右滑动,ViewPager也可左右滑动,

android自定义侧滑LisitView(包含编辑、删除)

(尊重原创转载请说明来处,谢谢)        最近由于项目的需要,自定义了一个具有侧滑功能的listview,侧滑后可以点击编辑、删除。好了,大家先看一下效果图,毕竟是看脸的世界 好了,我要先讲一下思路,一次编辑很难完善,有什么问题我后来还会补上,欢迎各位大神拍砖: 1:首先先说一下item:item用的LinearLayout布局,删除、编辑分别是写死了宽度的TextVi

sinat_27681957的博客 6639

一个控件搞定Android item侧滑删除菜单

【Android自定义ViewGroup】不一样的轮子,巧用类变量解决冲突,像IOS那样简单的使用侧滑删除,一个控件搞定Android item侧滑删除菜单。

Android自定义View之(下拉刷新+侧滑删除)

以前项目中用到了一个放qq的侧滑删除的效果,结果github上一搜就copy了一个,不得不说大神们写的真心牛逼,那个时候呢看到一个东西能用就可以了,也不管怎么实现的,现在反过来一看,原来自定义还可以这么玩,当然,前面项目中也因此出现了一个bug,就是我使用的是PulltorefreshScrollView,因此也出现了ScrollView跟ListView的事件冲突,呵呵,不怕笑话,当是体验不好,直

vv_bug 2578

Android开发-自定义View-AndroidStudio(十六)侧滑删除

对应博文:http://blog.youkuaiyun.com/iwanghang/article/details/53929510

仿QQ左滑删除

仿QQ左滑删除的Demo 博客地址:http://blog.youkuaiyun.com/u011072398/article/details/28392605

安卓自定义控件之左滑删除

安卓自定义控件之左滑删除 目标: 今天我们要做的效果图为: 左滑之后会有删除按钮。上面这个图,为了主要研究原理,我们就先只加删除按钮好了。 思路: 在实现这个功能的时候,看了些资料。主要有两种: 1、      将内容和按钮当做两个可操作的对象,然后通过DragViewHelper监听内容和按钮执行拖拽的操作方法。然后去重新onlayout他们的位置。 2

子敬的技术博客 1万+

PX4与ROS协同仿真:从键盘控制到无人机自主飞行

本文详细介绍了如何搭建PX4与ROS协同仿真环境,实现从键盘控制到无人机自主飞行的完整流程。通过XTDrone项目整合PX4飞控、ROS通信框架与Gazebo物理引擎,逐步讲解环境配置、键盘控制实现原理,并深入剖析了迈向Offboard模式实现自主飞行的核心代码与数据流,为无人机算法开发与测试提供了安全的仿真沙盒。

weixin_29169899的博客 498

Android之自定义View:侧滑删除

作者博客http://www.cherylgood.cn源码地址https://github.com/anzaizai/EasySwipeMenuLayout前言本篇要讲的是自定义vie...

陈宇明 290

帝国CMS v7.5存储型XSS漏洞挖掘与修复实战

存储型XSS(跨站脚本攻击)是一种常见的Web安全漏洞,其核心原理是攻击者将恶意脚本代码提交并永久存储在服务器端(如数据库),当其他用户访问包含该数据的页面时,脚本会在其浏览器中执行。这种漏洞的危害在于其持久性和广泛的影响范围,可能导致用户Cookie被窃取、会话被劫持,甚至引发蠕虫式传播。从技术价值看,理解存储型XSS有助于掌握Web应用安全的核心逻辑,即数据在输入、处理和输出全链路中的安全风险。在内容管理系统(CMS)等Web应用场景中,用户可控的输入点(如个人资料、评论、公告)若未经妥善过滤和输出编码

weixin_29327525的博客 299

cutlass2.x源码解读之PitchLinearStripminedThreadMap

TensorCoord:使用layout::PitchLinearCoord作为张量坐标。Shape:使用模板参数Shape_作为tile的形状,kThreads:线程总数,定义为模板参数Threads。kElementsPerAccess:每次访问的元素数,定义为模板参数ElementsPerAccess。ThreadAccessShape:线程访问的形状,使用layout::PitchLinearShape定义。内部实现细节:ShapeVec。

jiangjkd的专栏 787

高仿QQ6.0之側滑删除

前两天已经完毕了高仿QQ6.0側滑和优化,今天来看下側滑删除的实现吧,假设有兴趣,能够去看下之前的两篇,仿QQ6.0側滑之ViewDragHelper的使用(一)和高仿QQ6.0側滑菜单之滑动优化(二),好了不多说,開始今天的内容了。 假设看过之前的两篇的话,想必今天的非常好实现的。我们来分析一下哈,側滑删除,布局也就是前面一个item。然后有两个隐藏的button...

aodiyi6351的博客 76

STM32G474的HRTIM实战:用CubeMX配置互补PWM驱动全桥电路(附移相算法代码)

本文详细介绍了如何使用STM32G474的HRTIM高分辨率定时器,通过CubeMX配置互补PWM驱动全桥电路,并附移相算法代码。内容涵盖HRTIM硬件架构解析、CubeMX配置全流程、移相控制算法实现及调试技巧,为数字电源和电机控制领域提供实用解决方案。

weixin_27017211的博客 481

android 默认焦点设置_Android自定义实现TextView跑马灯效果

为什么使用跑马灯效果?经常使用TextView会出现这样的情况,有限的空间内只能写一行,然后导致好多文字被“...”表示了 而且有可能是重要信息被隐藏了,于是就有了跑马灯效果.什么是TextView跑马灯?TextView的跑马灯效果也就是指当你只想让TextView单行显示,可是文本内容却又超过一行时,自动从左往右慢慢滑动显示的效果就叫跑马灯效果.一、使用TextView属性来实现1....

weixin_39924307的博客 393

海上AI导航系统:技术架构与行业应用解析

计算机视觉与强化学习技术在海上导航系统中的应用正逐步改变传统航运业。通过多模态传感器融合技术,现代AI导航系统能够实现高精度的物体识别与实时路径规划,有效解决能见度依赖、决策延迟等核心痛点。以Orca AI的SeaPod系统为例,其结合了NVIDIA GeForce RTX 4070的边缘计算能力与多光谱协同识别技术,在恶劣环境下仍能保持稳定性能。这类系统不仅提升了航行安全性,还通过优化航线显著降低燃油消耗,在东京湾、马六甲海峡等繁忙水域展现出巨大价值。随着毫米波雷达融合方案的测试推进,未来海上导航将突破极

weixin_33597080的博客 354

双翌视觉系统配合机械手大视野定位案例(单目标带角度抓取)

一、定位原理概述 1.系统构架 视觉定位系统采用正向打光方式,光源在机械手上方,CCD从上往下拍摄,进行图像分析定位。相机将计算出的像素坐标转换为机械手的物理坐标,视觉软件与机械手进行网口通讯,将视野内物料的物理坐标发送给机械手,机械手抓取物料放在指定工位。 2.相机标定概述 系统采用宫格标定确定像素坐标和物理坐标一一对应关系,同时利用3点或者多点旋转标定求出旋转中心 系统采用宫格标定,自定义行列数和间距及旋转角度,通过机械手发送的当...

weixin_51554164的博客 2172

高仿 QQ 侧滑删除 Item 的效果

最近公司在做 一个飞信的一个功能!消息列表和QQ 的类似。 图:         其是很简单,之前在github 搜索的 sliderList, sliderLayout.我都用不了。因为代码导入到 Eclispe 中无法使用。 这是网址: http://blog.youkuaiyun.com/phj_981805903/article/details/21394241

love_Javc_you的专栏 7637

YOLOv8 改进有效涨点专栏目录 | 含卷积、主干、注意力机制、Neck、检测头、损失函数、二次创新C2PSA/C3k2等各种网络结构改进

YOLOv8在目标检测领域的地位与优势模型改进的意义与价值本专栏的特色与创新点读者学习路径建议关键改进点回顾不同场景的模型选型建议开源社区资源汇总持续学习路径指南YOLOv8在目标检测领域的地位与优势模型改进的意义与价值本专栏的特色与创新点读者学习路径建议关键改进点回顾不同场景的模型选型建议开源社区资源汇总持续学习路径指南。

weixin_39818775的博客 1072

仿QQ侧滑删除(简陋版)

今天想试试android View的事件分发机制,于是自制了一个仿QQ的侧滑删除当小白鼠,利用这个来验证View面对不同的情况下,的事件分发情况。 由于是当给自己当试验品用,做的有点简陋,不对那可是相当简陋。 原理:首先一个全屏的item加上一个button拼接成一个HorizontalScrollView。让button显示在屏幕的外面,当侧滑的时候显示出button。之后放入listview

IZZY 693

超声相控阵合成孔径成像FPGA设计介绍

1.仿真预览 2.理论分析 系统的基本结构如下所示: 以上是实际中完整的结构,系统中会涉及到两块板子中的时钟,这个就是设计一个时钟采样同步的问题,即所谓的时钟同步。一般这种情况,往往使用内插的方式来解决。这是由于,在实际中,超生波接收到的信号是由本身系统发送出去反射回来得到的,因此从另外一方面将,其是同步的。但是在接收的时候通过内插的方法解决其中的延迟问题。 根据论文中的介绍,整个系统分为如下几个部分: ·模拟发送信号,这个部分由MATLAB产生测试数据并量...

FPGA/MATLAB学习教程/源码/项目合作开发 2069

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 侧滑删除

侧滑删除 布局: <com.zhcy.healthmanager.view.ui.MemorandumLabelView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="43dp" android:l...

weixin_42716507的博客 454

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android高仿qq源码,Android高仿QQ6.0侧滑删除实例代码

推荐阅读:先给大家分享一下,侧滑删除,布局也就是前面一个item,然后有两个隐藏的按钮(TextView也可以),然后我们可以向左侧滑动,然后显示出来,然后对delete(删除键)实现监听,就可以了哈。好了那就来看看代码怎么实现的吧。首先和之前一样自定义View,初始化ViewDragHelper:package com.example.removesidepull;import android....

weixin_32771631的博客 690

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

实现仿QQ滑动侧边栏及滑动删除效果

1.0版本 侧滑主页面,包含侧边菜单栏和主界面的消息栏显示 package com.example.qxb_810.wigdets; import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.Display; ...

猫吻鱼的博客 870

安卓仿IOS侧滑关闭页面 。

这个功能实在是太常见了 。 今天给大家封装了 一个不错的 自定义 滑动删除的 View  ,废话不多说了,直接上代码 。   再自定义View中会使用这个颜色,可以根据项目需求自己设置 。 名称 left_shadow.xml、。哎有人问为什么把名称都写下来呢 。有助于一些 小伙伴门的黏贴。 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;...

xujiajian119的博客 348

仿QQ侧滑删除,你还在苦于找轮子吗

客服:“xxx,退货的按钮在哪啊,我怎么找不到啊?”我:“像Android 手机QQ一样侧滑就出来了。。。”。类似这样的对话重复上演了N次 没错,今天我要介绍的是和QQ一样的侧滑删除类似的操作,SwipeMenuLayout登场~~ 最早收到的要实现Item侧滑删除的需求是在2016年的一个餐饮项目,当时刚入坑没多久,还以为SDK就有现成的API,毕竟像QQ这种超级App都用的这么骚了。于是一...

优了个秀 241
上一篇: android自定义View练习之波浪View
下一篇: Android开发之获取屏幕宽高
红鼻子老头
博客等级 码龄10年 10粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值