QQ5.0的侧滑效果和viewdrawhelper的简单使用

2023-11-06 21:20

本文主要是介绍QQ5.0的侧滑效果和viewdrawhelper的简单使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1自定义MySlidingMenu

public class MySlidingMenu extends FrameLayout {}

1.1在MainActivity中使用

<com.myname.qq50.MySlidingMenu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/sliding"android:layout_width="match_parent"android:layout_height="match_parent"><include layout="@layout/layout_menu" /><include layout="@layout/layout_main" />
</com.myname.qq50.MySlidingMenu>

1.2 布局layout_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"android:orientation="vertical"><FrameLayout
        android:layout_width="match_parent"android:layout_height="60dp"android:background="#18B4ED"><ImageView
            android:id="@+id/iv_head"android:layout_width="50dp"android:layout_height="50dp"android:layout_gravity="center_vertical"android:layout_marginLeft="30dp"android:src="@mipmap/head" /></FrameLayout><ListView
        android:id="@+id/main_listview"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

1.3layout_menu

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingLeft="15dp"><ImageView
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="50dp"android:background="@mipmap/head" /><ListView
        android:id="@+id/menu_listview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="5dp"></ListView></LinearLayout>

自定义控件MyslidingMenu

1.1今天比较懒就不一步一步写了


/*** Created by Administrator on 2017/1/18.*/public class MySlidingMenu extends FrameLayout {private View menu;private View main;private ViewDragHelper viewDragHelper;private int maxLeft;private onSlidingMenuListen listener;public MySlidingMenu(Context context, AttributeSet attrs) {this(context, attrs, -1);}public MySlidingMenu(Context context) {this(context, null);}public MySlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);//加viewdrawhelper 是为了处理 触摸事件//ViewDragHelper是一个用于编写自定义ViewGroups的实用程序类。它提供了一些// 有用的操作和状态允许用户拖动和重新定位,追踪//他们的父母的ViewGroup之内的意见。viewDragHelper = ViewDragHelper.create(this, callback);}/**2017/1/18 18:47*当加载完布局结束标签的时候,调用的方法,表示布局加载完控件* 这个时候是没有执行测量款到,所以获取不到宽高*/@Overrideprotected void onFinishInflate() {super.onFinishInflate();menu = getChildAt(0);main = getChildAt(1);}ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {private int newLeft;/**2017/1/18 18:56**/@Overridepublic void onViewDragStateChanged(int state) {super.onViewDragStateChanged(state);}/*** 当view位置改变的时候调用的方法* @param changedView* @param left* @param top* @param dx* @param dy*/@Overridepublic void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {super.onViewPositionChanged(changedView, left, top, dx, dy);//当 滑动内容页的时可以滑动,菜单页的位置不改变 只是缩放if (changedView == menu) {//设置菜单页位置不能改变//对 子控件重新排版,是位置固定menu.layout(0, 0, menu.getMeasuredWidth(), menu.getMeasuredHeight());//更改内容页面的位置newLeft = main.getLeft() + dx;newLeft = getLeft(newLeft);main.layout(newLeft, 0, main.getMeasuredWidth() + newLeft, main.getMeasuredHeight());}//根据缩放的百分比进行缩放效果的实现float fraction = main.getLeft() * 1f / maxLeft;execAnim(fraction);//通过回调将百分比传递给activityif (listener != null) {listener.setRotate(fraction);if (fraction == 0f) {listener.setIsOpen(false);} else if (fraction == 1f) {listener.setIsOpen(true);}}}//捕获触摸事件调用的       @Overridepublic void onViewCaptured(View capturedChild, int activePointerId) {super.onViewCaptured(capturedChild, activePointerId);}/*** 手指抬起的时候* @param releasedChild* @param xvel  速度* @param yvel*/@Overridepublic void onViewReleased(View releasedChild, float xvel, float yvel) {super.onViewReleased(releasedChild, xvel, yvel);//当手指松开的时候,回弹if (main.getLeft() > maxLeft / 2) {//平滑回弹效果viewDragHelper.smoothSlideViewTo(main, maxLeft, 0);//安卓提供的兼容性方法,效果跟invalidate一样是重新触发滚动ViewCompat.postInvalidateOnAnimation(MySlidingMenu.this);} else {viewDragHelper.smoothSlideViewTo(main, 0, 0);ViewCompat.postInvalidateOnAnimation(MySlidingMenu.this);}}/*** 设置是否强制进行水平滑动,如果需要强制水平滑动,返回大于0的值* @param child* @return*/@Overridepublic int getViewHorizontalDragRange(View child) {return 1;}/**2017/1/18 18:57        设置时候可以捕获view的触摸事件*  触摸事件的view对象        多点触摸的索引**/@Overridepublic boolean tryCaptureView(View child, int pointerId) {return true;}/*** 当view滑动的时候调用的方法* @param child* @param left  viewdraghelper认为我们要将控件移动的距离* @param dx 手指滑动的距离* @return实际我们想让控件移动的距离*/@Overridepublic int clampViewPositionHorizontal(View child, int left, int dx) {if (child == main) {left = getLeft(left);}return left;}};private void execAnim(float fraction) {//floatevaluator float类型的估值器根据百分比计算出对应的值//argbRvaluator 颜色的估值器ArgbEvaluator argbEvaluator = new ArgbEvaluator();//缩放的值=开始的值+(结束的值-开始的值)*缩放的百分比Float evaluate = new FloatEvaluator().evaluate(fraction, 1.0f, 0.8f);//首页缩放的操作main.setScaleX(evaluate);main.setScaleY(evaluate);//菜单页 的缩放操作  0.3f->1.0f 除了有缩放 还有偏移从一半开始偏移menu.setScaleX(new FloatEvaluator().evaluate(fraction, 0.3, 1.0f));menu.setScaleY(new FloatEvaluator().evaluate(fraction, 0.3, 1.0f));menu.setTranslationX(new FloatEvaluator().evaluate(fraction, -menu.getMeasuredWidth() / 2, 0));//设置背景的滤镜效果  渐变操作if (getBackground() != null) {int color = (int) argbEvaluator.evaluate(fraction, Color.BLACK, Color.TRANSPARENT);//覆盖的类型.PorterDuff.Mode.SRC//显示上层绘制图片getBackground().setColorFilter(color, PorterDuff.Mode.SRC_OVER);}}//重写 -computescroll才会实现回弹@Overridepublic void computeScroll() {super.computeScroll();//判断是否可以继续滑动if (viewDragHelper.continueSettling(true)) {ViewCompat.postInvalidateOnAnimation(MySlidingMenu.this);}}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);maxLeft = (int) (getMeasuredWidth() * 0.6f);}/*** 将触摸事件 传递给viewdraghelper ,方便进行触摸 滑动操作* 如果ominterceptouchevent拦截事件,ontouch里面的方法不执行* 所以为了保证触摸时间可以完全传递到viewdraghelper 我们需要对两个方法进行重写** @param ev* @return*/@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {boolean result = viewDragHelper.shouldInterceptTouchEvent(ev);return result;}@Overridepublic boolean onTouchEvent(MotionEvent event) {//需要将出迷时间传递给viewdrawhelperviewDragHelper.processTouchEvent(event);return true;}public int getLeft(int left) {if (left < 0) {left = 0;} else if (left > maxLeft) {left = maxLeft;}return left;}public void setonSlidingMenuListener(onSlidingMenuListen listener) {this.listener = listener;}//通过设置回调设置imageview的旋转和打开操作  在自定义方法中//创建回调方法 将百分比传给activity使用 public interface onSlidingMenuListen {public void setRotate(float fraction);public void setIsOpen(boolean isOpen);}}

1.2mainActivity中的逻辑

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView menuListView = (ListView) findViewById(R.id.menu_listview);final ListView mainListView = (ListView) findViewById(R.id.main_listview);final ImageView imageview= (ImageView) findViewById(R.id.iv_head);MySlidingMenu slidingMenu = (MySlidingMenu) findViewById(R.id.sliding);mainListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,Constant.NAMES));menuListView.setAdapter(new ArrayAdapter<String >(this,android.R.layout.simple_list_item_1,Constant.sCheeseStrings){@NonNull@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView textView = (TextView) super.getView(position, convertView, parent);textView.setTextColor(Color.WHITE);return textView;}});slidingMenu.setonSlidingMenuListener(new MySlidingMenu.onSlidingMenuListen() {@Overridepublic void setRotate(float fraction) {imageview.setRotation(360*fraction);}@Overridepublic void setIsOpen(boolean isOpen) {if (isOpen) {Toast.makeText(MainActivity.this,"开",Toast.LENGTH_SHORT).show();}else{Toast.makeText(MainActivity.this,"关",Toast.LENGTH_SHORT).show();}}});}
}

1.4参数

public interface Constant {public static final String[] sCheeseStrings = {"Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi","Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale","Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese","Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell","Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc","Cougar Gold", "Coulommiers", "Coverdale", "Crayeux de Roncq", "Cream Cheese","Cream Havarti", "Crema Agria", "Crema Mexicana", "Creme Fraiche", "Crescenza","Croghan", "Crottin de Chavignol", "Crottin du Chavignol", "Crowdie", "Crowley","Zamorano", "Zanetti Grana Padano", "Zanetti Parmigiano Reggiano"};public static final String[] NAMES = new String[]{"宋江", "卢俊义", "吴用","公孙胜", "关胜", "林冲", "秦明", "呼延灼", "花荣", "柴进", "李应", "朱仝", "鲁智深","武松", "董平", "张清", "杨志", "徐宁", "索超", "戴宗", "刘唐", "李逵", "史进", "穆弘","雷横", "李俊", "阮小二", "张横", "阮小五", " 张顺", "阮小七", "杨雄", "石秀", "解珍"," 解宝", "燕青", "朱武", "黄信", "孙立", "宣赞", "郝思文", "韩滔", "彭玘", "单廷珪","魏定国", "萧让", "裴宣", "欧鹏", "邓飞", " 燕顺", "杨林", "凌振", "蒋敬", "吕方","郭 盛", "安道全", "皇甫端", "王英", "扈三娘", "鲍旭", "樊瑞", "孔明", "孔亮", "项充","李衮", "金大坚", "马麟", "童威", "童猛", "孟康", "侯健", "陈达", "杨春", "郑天寿","陶宗旺", "宋清", "乐和", "龚旺", "丁得孙", "穆春", "曹正", "宋万", "杜迁", "薛永", "施恩",};
}

效果

这里写图片描述

这篇关于QQ5.0的侧滑效果和viewdrawhelper的简单使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/359128

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学