自定义左右侧滑菜单

实现效果:

  • 左右侧滑菜单,侧滑栏占主屏比为60%
  • 监听触控,自定义滑动动画,当侧边栏滑动超过50%松开触控将自动滑动到60%,未超过50%松开触控回归侧边栏隐藏
  • 为主屏设置蒙版效果,根据侧滑菜单的占屏比设置主屏蒙版透明度

不知道如何制作动画,所以就将就着看吧,懂意思就行,如图:


代码如下:MainActivity

package com.example.mymenu;import android.os.Bundle;
import android.app.Activity;
import android.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;public class MainActivity extends FragmentActivity {private MainUI mainui;private LeftMenu leftMenu;private RightMenu rightMenu;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mainui=new MainUI(this);setContentView(mainui);leftMenu=new LeftMenu();rightMenu=new RightMenu();getSupportFragmentManager().beginTransaction().add(MainUI.LEFT_ID, leftMenu).commit();getSupportFragmentManager().beginTransaction().add(MainUI.RIGHT_ID, rightMenu).commit();}
}

MainUI:

package com.example.mymenu;import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.Scroller;public class MainUI extends RelativeLayout{private Context context;private FrameLayout leftMenu;private FrameLayout rightMenu;private FrameLayout middMenu;private Scroller mscroller;private FrameLayout middMask;public static final int LEFT_ID=0xaabbcc;public static final int MIDEELE_ID=0xaaccdd;public static final int RIGHT_ID=0xddbbcc;public MainUI(Context context) {super(context);setView(context);}public MainUI(Context context, AttributeSet attrs) {super(context, attrs);}private void setView(Context context){this.context=context;mscroller=new Scroller(context,new DecelerateInterpolator());leftMenu=new FrameLayout(context);rightMenu=new FrameLayout(context);middMenu=new FrameLayout(context);middMask=new FrameLayout(context);leftMenu.setBackgroundColor(Color.LTGRAY);rightMenu.setBackgroundColor(Color.GREEN);middMenu.setBackgroundColor(Color.CYAN);middMask.setBackgroundColor(0x88000000);//蒙版颜色leftMenu.setId(LEFT_ID);middMenu.setId(MIDEELE_ID);rightMenu.setId(RIGHT_ID);addView(leftMenu);addView(middMenu);addView(rightMenu);addView(middMask);middMask.setAlpha(0);onMiddleMask();}public float onMiddleMask(){System.out.println("透明度"+middMask.getAlpha());return middMask.getAlpha();}/** 根据滑动改变蒙版的透明度*/@Overridepublic void scrollTo(int x, int y) {super.scrollTo(x, y);int curX=Math.abs(getScrollX());float scale=curX/(float)leftMenu.getMeasuredWidth();middMask.setAlpha(scale);}/**绘制界面*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);middMenu.measure(widthMeasureSpec, heightMeasureSpec);middMask.measure(widthMeasureSpec, heightMeasureSpec);int realWidth=MeasureSpec.getSize(widthMeasureSpec);int tempWithMeasure=MeasureSpec.makeMeasureSpec((int)(realWidth*0.6f),MeasureSpec.EXACTLY);leftMenu.measure(tempWithMeasure, heightMeasureSpec);rightMenu.measure(tempWithMeasure,heightMeasureSpec);//		middMenu.measure(tempWithMeasure, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);middMenu.layout(l, t, r, b);middMask.layout(l, t, r, b);leftMenu.layout(l-leftMenu.getMeasuredWidth(), t, r, b);rightMenu.layout(l+middMenu.getMeasuredWidth(),t, l+middMenu.getMeasuredWidth()+rightMenu.getMeasuredWidth(), b);}/** 判断是怎么样的一个事件*/private boolean isTestCompete;private boolean isleftrightEvent;@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if(!isTestCompete){getEventType(ev);//判断触控的类型return true;}/** 有滑动事件*/if(isleftrightEvent){switch (ev.getActionMasked()) {case MotionEvent.ACTION_MOVE:int curScrollX=getScrollX();int dis_x=(int) (ev.getX()-point.x);int expectX=-dis_x+curScrollX;int finalX=0;if(expectX<0){finalX=Math.max(expectX,-leftMenu.getMeasuredWidth());}else{finalX=Math.min(expectX, rightMenu.getMeasuredWidth());}/** 移动到当前位置*/scrollTo(finalX, 0);point.x=(int) ev.getX();break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL://手抬起来的操作curScrollX=getScrollX();//判断滑动的距离是否超过了Menu的一半if(Math.abs(curScrollX)>leftMenu.getMeasuredWidth()>>1){//判断左右滑动if(curScrollX<0){mscroller.startScroll(curScrollX, 0, -leftMenu.getMeasuredWidth()-curScrollX, 0,200);}else{mscroller.startScroll(curScrollX, 0, leftMenu.getMeasuredWidth()-curScrollX, 0,200);}}else{mscroller.startScroll(curScrollX, 0, -curScrollX, 0,200);}invalidate();isleftrightEvent=false;isTestCompete=false;break;}}else{/** /上下滑动监听*/switch (ev.getActionMasked()) {case MotionEvent.ACTION_UP:isleftrightEvent=false;isTestCompete=false;break;}}return super.dispatchTouchEvent(ev);}@Overridepublic void computeScroll() {super.computeScroll();if(!mscroller.computeScrollOffset()){return;}int tempX=mscroller.getCurrX();scrollTo(tempX, 0);}/** 监听触控事件*/private Point point=new Point();//点,获取当前滑动的距离private static final int TEST_DIS=20;//设置一个被比较的值private void getEventType(MotionEvent ev) {switch (ev.getActionMasked()) {case MotionEvent.ACTION_DOWN://按下point.x=(int) ev.getX();point.y=(int) ev.getY();super.dispatchTouchEvent(ev);break;case MotionEvent.ACTION_MOVE:/** 移动的距离*/int dX=Math.abs((int) ev.getX()-point.x);int dY=Math.abs((int) ev.getY()-point.y);if(dX>=TEST_DIS&&dX>dY){//左右滑动的距离isleftrightEvent=true;isTestCompete=true;/** 滑动之后获取当前的 坐标*/point.x=(int) ev.getX();point.y=(int) ev.getY();}else if(dY>=TEST_DIS&&dY>dX){//上下滑动isleftrightEvent=false;isTestCompete=true;point.x=(int) ev.getX();point.y=(int) ev.getY();}break;case MotionEvent.ACTION_UP: break;case MotionEvent.ACTION_CANCEL:super.dispatchTouchEvent(ev);isleftrightEvent=false;isTestCompete=false;break;}}
}

两侧的菜单代码就不帖了!GemeOver


转载于:https://www.cnblogs.com/xiangevan/p/10751756.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

秦九韶算法matlab程序,数值分析matlab程序实例.doc

数值分析matlab程序实例1&#xff0c;秦九韶算法&#xff0c;求出P(x3)24x5x^22x^3的值clear?all;x3;n3;a(1)2;a(2)4;a(3)5;a(4)2v(1)a(n1);for k2:(n1);v(k)x*v(k-1)a(n-k2);end?pv(n1)p ,1132&#xff0c;一次线型插值程序&#xff1a;利用100.121.求115的开方。clear all;…

在github上创建新分支

在github上创建仓库&#xff1a; Create a new repository on the command line touch README.md git init git add README.md git commit -m "first commit" git remote add origin https://github.com/BrentHuang/MyRepo.git git push -u origin master 在本地新建…

以python程序调用的系统_python 系统调用的实例详解

python 系统调用的实例详解本文将通过两种方法对python 系统调用进行讲解&#xff0c;包括python使用CreateProcess函数运行其他程序和ctypes模块的实例&#xff0c;一 python使用CreateProcess函数运行其他程序>>> import win32process>>> handle win32pro…

ubuntu php7 memcache,linux上安装php7 memcache扩展

php7安装memcache扩展需要memcache php7的分支 否则安装会失败php7的memcache扩展安装&#xff0c;真的很让人心碎&#xff01;下面则是php7的扩展memcache安装了。用之前的php版本安装是没有问题&#xff0c;但是用了php7安装 http://pecl.php.net/package/memcache 下的任一…

好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界

好文原文地址&#xff1a;http://segmentfault.com/a/1190000000354555 本文将首先介绍grunt-markdown插件如何配合HTML模板使用&#xff0c;接着我将介绍如何使用grunt-watch插件将工作效率提升至新层次。如果你不熟悉GruntJS&#xff0c;请先阅读我关于GruntJS的文章。 Githu…

python3有多少个关键字排序_python3 数据结构和算法-- 通过某个关键字排序一个字典列表...

通过某个关键字排序一个字典列表问题你有一个字典列表&#xff0c;你想根据某个或某几个字典字段来排序这个列表。解决方案通过使用 operator 模块的 itemgetter 函数&#xff0c;可以非常容易的排序这样的数据结构。 假设你从数据库中检索出来网站会员信息列表&#xff0c;并且…

php页面怎么去登录,php中登录后跳转回原来要访问的页面实例

在很多网站用户先访问一个要登录的页面&#xff0c;但当时没有登录后来登录了&#xff0c;等待用户登录成功之后肯定希望返回到上次访问的页面&#xff0c;下面我就来给大家介绍登录后跳转回原来要访问的页面实例最简单的办法就是直接使用php $_SERVER[HTTP_REFERER]如果我在A.…

三目运算

total>100?total*0.8:total;//true执行冒号前面的&#xff1b;false执行冒号后面的 等价于 if(total>100){ totaltotal*0.8; }else{ totaltotal; }转载于:https://www.cnblogs.com/barbie7/p/5129566.html

二叉树的创建_大多数人都不会手写创建并遍历二叉树,一航这里帮你终结了

创建二叉树、遍历二叉树、二叉树的最近公共祖先任何疑问、意见、建议请公众号留言或联系qq474356284先序、后序创建二叉树先中后层序遍历二叉树二叉树的最近公共祖先 输入格式&#xff1a;创建二叉树时的输入&#xff1a;如序列&#xff1a;{1 2 -1 -1 3 -1 -1}表示1结点有2,…

tp5 php正则邮箱,TP5验证器使用实例

TP5验证器建立模块\validate\验证器文件名例如我们定义了一个验证USER的验证器类<?php namespace app\admin\validate;use think\Validate;class Admin extends Validate{protected $rule [username > require|min:3|max:16|unique:admin,password > require|min:6|…

zookeeper 密码_阿里资深JAVA架构带你深度剖析dubbo和zookeeper关系

为什么要用dubbo&#xff1f;当网站规模达到了一定的量级的时候&#xff0c;普通的MVC框架已经不能满足我们的需求&#xff0c;于是分布式的服务框架和流动式的架构就凸显出来了。单一应用架构当网站流量很小时&#xff0c;只需一个应用&#xff0c;将所有功能都部署在一起&…

python pandas csv 追加 空行,python – Pandas:read_csv在空行后忽略行

有一个奇怪的.csv文件,如&#xff1a;header1,header2,header3val11,val12,val13val21,val22,val23val31,val32,val33很好,但在这些线之后,总会有一个空行,后面跟着很多无用的线.整个事情是一致的&#xff1a;header1,header2,header3val11,val12,val13val21,val22,val23val31,…

nw.js FrameLess Window下的窗口拖拽与窗口大小控制

nw.js FrameLess Window下的窗口拖拽与窗口大小控制 很多时候&#xff0c;我们觉得系统的Frame框很难看&#xff0c;于是想自定义。 自定义Frame的第一步是在package.config文件中将frame选项设置为false。 { "name": "1", "main": "index.…

python控制语句实验报告,python流程控制语句案例练习

最近玩python&#xff0c;为了更好的学习其中的流程控制语句&#xff0c;本身写了一个查询员工信息和更新信息的脚本&#xff0c;此脚本仅供练习使用。大拿可绕行&#xff01;python#!/usr/bin/env pythonimport sysimport osos.system(clear)mess \033[;35m ID :%s\033[0m\03…

linux 文件重命名_如何在 Linux 上重命名一组文件 | Linux 中国

要用单个命令重命名一组文件&#xff0c;请使用 rename 命令。它需要使用正则表达式&#xff0c;并且可以在开始前告诉你会有什么更改。-- Sandra Henry-stocker几十年来&#xff0c;Linux 用户一直使用 mv 命令重命名文件。它很简单&#xff0c;并且能做到你要做的。但有时你需…

Spring 构造注入 传參数

1. 提供相应的构造方法 //构造器注入 public class Bean6 {private String name;private Integer age;// 服务于构造器注入使用public Bean6(String name, Integer age) {super();this.name name;this.age age;}public void show() {System.out.println("bean6:&…

php正则表达式函数案例,PHP正则表达式函数preg_replace用法实例分析

PHP正则表达式函数preg_replace用法。&#xff0c;具体如下&#xff1a;preg_replace 执行一个正则表达式的搜索和替换语法&#xff1a;preg_replace (pattern ,replacement ,subject,limit,count )参数描述pattern正则表达式(字符串或字符串数组)replacement用于替换的字符串或…

python tk protocol_Python Modbus_tk在树莓派上实现rtu master

利用 python modbus工具实现modbus从站的数据采集&#xff0c;很方便简单。Python Modbus 协议工具目前有下面三种&#xff1a;modbus_tk&#xff1a;完整modbus协议栈的实现&#xff0c;支持modbus tcp/rtu&#xff5b;1.提供slave模拟器&#xff0c;即模拟modbus server:502)…

根据另外一个表来更新,增加字段

update table1 set field1table2.field1,field2table2.field2from table2where table1.idtable2.id添加字段&#xff1a;alter table 表名 add 字段名 类型删除字段&#xff1a;alter table 表名 drop column 字段名转载于:https://www.cnblogs.com/yzwdli/p/5147512.html

html注册跳转php错误500,页面跳转后提示HTTP 异常 500(Internal Server Error):服务器尝试执行请求时遇到了意外情况...

页面跳转后提示HTTP 错误 500(Internal Server Error)&#xff1a;服务器尝试执行请求时遇到了意外情况。index.php跳转到chkadmin.php提示(服务器错误网站在检索 http://localhost/shop/admin/chkadmin.php 时遇到错误。 该网站可能关闭进行维护或配置不正确。以下是一些建议&…