Android自定义布局实现仿qq侧滑部分代码
发布时间 - 2026-01-11 00:27:08 点击率:次自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下

源码DEMO地址:https://github.com/applelili/ImitationQQ
实现说明:
通过自定义布局实现:
SlidingLayout继承于 HorizontalScrollView
/**
* Created by Administrator on 2017/3/29.
*/
public class SlidingLayout extends HorizontalScrollView{
/** 左侧右边间距 */
private float rightPadding;
/** 左侧菜单的宽度 */
private int leftWidth;
private ViewGroup leftView;
private ViewGroup contentView;
private final Context context;
private boolean isOpenMeun = true;
private ImageView shadowView;
public SlidingLayout(Context context) {
this(context,null);
}
public SlidingLayout(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public SlidingLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
//获取自定义的属性
TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.SlidingLayout);
rightPadding=typedArray.getDimension(R.styleable.SlidingLayout_rightPadding,80);
//计算左侧菜单的宽度
leftWidth = (int) (getScreenWidth() - rightPadding + 0.5f);
}
//获取屏幕的宽度
private float getScreenWidth() {
return getResources().getDisplayMetrics().widthPixels;
}
@Override /** 布局解析完毕的时候 */
protected void onFinishInflate() {
super.onFinishInflate();
ViewGroup container= (ViewGroup) getChildAt(0);
if(container.getChildCount() > 2){
throw new IllegalStateException("SlidingLayout中只能放两个子View");
}
//获取左侧菜单view
leftView = (ViewGroup) container.getChildAt(0);
//获取主布局的Viwe
contentView = (ViewGroup) container.getChildAt(1);
//设置子view 的宽度
leftView.getLayoutParams().width = leftWidth;
contentView.getLayoutParams().width = (int) getScreenWidth();
//移除父布局
container.removeView(contentView);
FrameLayout frameLayout=new FrameLayout(context);
frameLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
frameLayout.addView(contentView);
//添加阴影
shadowView = new ImageView(context);
shadowView.setBackgroundColor(Color.parseColor("#99000000"));
frameLayout.addView(shadowView);
container.addView(frameLayout);
}
/**
* 该方法在滑动的时候会不断的调用
* @param l : left
* @param t
* @param oldl
* @param oldt
*/
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
float x=l*0.8f;//偏移量
leftView.setTranslationX(x);//平移
float color = 1 - l * 1.0f / leftWidth;
shadowView.setAlpha(color);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP://手指抬起的时候判断是否关闭
int currentX = getScrollX();
if (isOpenMeun) {
if (currentX >= leftWidth / 2) {
closeMeun();
} else {
openMeun();
}
//点击关闭
float x = ev.getX();
if (x > leftWidth) {
closeMeun();
}
return true;
} else {//关闭状态
if (currentX < leftWidth / 2) {
openMeun();
} else {
closeMeun();
}
return true;
}
}
return super.onTouchEvent(ev);
}
/** 关闭菜单 */
public void closeMeun(){
isOpenMeun = false;
smoothScrollTo(leftWidth,0);// 250ms
}
/** 打开菜单 */
public void openMeun(){
isOpenMeun = true;
smoothScrollTo(0,0);
}
}
attrs属性文件
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="SlidingLayout"> <attr name="rightPadding" format="dimension"/> </declare-styleable> </resources>
布局方面
<?xml version="1.0" encoding="utf-8"?> <com.example.myqq.SlidingLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" app:rightPadding="65dp" tools:context="com.example.myqq.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <include layout="@layout/left_main" /> <include layout="@layout/right_main" /> </LinearLayout> </com.example.myqq.SlidingLayout>
activity
package com.example.myqq;
import android.animation.ObjectAnimator;
import android.annotation.TargetApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private String strings[] = {"开通会员", "QQ钱包", "个性装扮", "我的收藏", "我的相册", "我的文件", "我的日程", "我的名片夹"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setState();
setContentView(R.layout.activity_main);
ListView listView= (ListView) findViewById(R.id.list_left);
listView.setDividerHeight(0);
listView.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,strings));
ImageView bgimg1= (ImageView) findViewById(R.id.bgimg);
float currentY=bgimg1.getTranslationY();
ObjectAnimator animator = ObjectAnimator.ofFloat(bgimg1, "translationY", currentY, -100, -40, currentY);
animator.setDuration(5000);
animator.setRepeatCount(ObjectAnimator.INFINITE);
animator.start();
}
@TargetApi(20)
private void setState() {
WindowManager.LayoutParams params=new WindowManager.LayoutParams();
params.flags=WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
getWindow().setAttributes(params);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# qq
# 侧滑
# Android高仿QQ6.0侧滑删除实例代码
# Android使用ViewDragHelper实现仿QQ6.0侧滑界面(一)
# Android使用ViewDragHelper实现QQ6.X最新版本侧滑界面效果实例代码
# Android滑动优化高仿QQ6.0侧滑菜单(滑动优化)
# Android使用DrawerLayout实现仿QQ双向侧滑菜单
# 基于Android实现仿QQ5.0侧滑
# Android基于ViewDragHelper仿QQ5.0侧滑界面效果
# Android程序开发之使用Design包实现QQ动画侧滑效果和滑动菜单导航
# Android自定义view系列之99.99%实现QQ侧滑删除效果实例代码详解
# Android仿QQ6.0主页面侧滑效果
# 自定义
# 具体内容
# 大家多多
# 移除
# 判断是否
# 名片夹
# 偏移量
# getChildAt
# getChildCount
# container
# onFinishInflate
# void
# IllegalStateException
# View
# throw
# gt
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建FTP站点实现文件共享?
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
如何用PHP工具快速搭建高效网站?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
JavaScript中的标签模板是什么_它如何扩展字符串功能
教你用AI将一段旋律扩展成一首完整的曲子
如何快速登录WAP自助建站平台?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel如何为API编写文档_Laravel API文档生成与维护方法
JavaScript如何实现音频处理_Web Audio API如何工作?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
网站制作免费,什么网站能看正片电影?
Laravel如何升级到最新版本?(升级指南和步骤)
JS实现鼠标移上去显示图片或微信二维码
企业网站制作这些问题要关注
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
如何在阿里云部署织梦网站?
音响网站制作视频教程,隆霸音响官方网站?
javascript基于原型链的继承及call和apply函数用法分析
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
phpredis提高消息队列的实时性方法(推荐)
昵图网官网入口 昵图网素材平台官方入口
如何快速上传自定义模板至建站之星?
Laravel如何使用withoutEvents方法临时禁用模型事件
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
如何快速搭建虚拟主机网站?新手必看指南
如何选择可靠的免备案建站服务器?
HTML 中动态设置元素 name 属性的正确语法详解
个人网站制作流程图片大全,个人网站如何注销?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
利用 Google AI 进行 YouTube 视频 SEO 描述优化
PythonWeb开发入门教程_Flask快速构建Web应用
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Laravel PHP版本要求一览_Laravel各版本环境要求对照

