左右菜单

菜单布局

新建工程MyMenu

新建class MainUI作为主UI 继承自RelativeLayout

private Context context;

private FrameLayout leftMenu;

private FrameLayout middleMenu;

private FrameLayout rightMenu;

public MainUI(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

initView(context);

}

public MainUI(Context context) {

super(context);

// TODO Auto-generated constructor stub

initView(context);

}

public void initView(Context context){

this.context = context;

leftMenu = new FrameLayout(context);

middleMenu = new FrameLayout(context);

rightMenu = new FrameLayout(context);

leftMenu.setBackgroundColor(Color.RED);

middleMenu.setBackgroundColor(Color.GREEN);

rightMenu.setBackgroundColor(Color.RED);

addView(leftMenu);

addView(middleMenu);

addView(rightMenu);

}

//测量设置宽高

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// TODO Auto-generated method stub

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

middleMenu.measure(widthMeasureSpec, heightMeasureSpec);

int realWidth = MeasureSpec.getSize(widthMeasureSpec);

int tempWidthMeasure = MeasureSpec.makeMeasureSpec((int)(realWidth*0.8f), MeasureSpec.EXACTLY);

leftMenu.measure(tempWidthMeasure, heightMeasureSpec);

rightMenu.measure(tempWidthMeasure, heightMeasureSpec);

}

//填充

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

// TODO Auto-generated method stub

super.onLayout(changed, l, t, r, b);

middleMenu.layout(l, t, r, b);

leftMenu.layout(l-leftMenu.getMeasuredWidth(), t, l, b);

rightMenu.layout(r, t, r+rightMenu.getMeasuredWidth(), b);

}

MainActivity文件

private MainUI mainUI;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mainUI = new MainUI(this);

setContentView(mainUI);

}

左右滑动

监听事件,做事件处理 事件分发

判断上下事件还是左右事件还有点击事件

private boolean isTestCompete;//测试值

private boolean isleftrightEvent;

@Override

//事件分发

public 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);

System.out.println("curScrollX="+curScrollX +",dis_x="+dis_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:

isleftrightEvent = false;

isTestCompete = false;

break;

case MotionEvent.ACTION_CANCEL:

isleftrightEvent = false;

isTestCompete = false;

break;

default:

break;

}

}else{

switch (ev.getActionMasked()) {

case MotionEvent.ACTION_UP:

isleftrightEvent = false;

isTestCompete = false;

break;

default:

break;

}

}

return super.dispatchTouchEvent(ev);

}

private Point point = new Point();

private static final int TEST_DIS = 20;

private void getEventType(MotionEvent ev) {

// TODO Auto-generated method stub

switch (ev.getActionMasked()) {

case MotionEvent.ACTION_DOWN:

point.x = (int)ev.getX();

point.y = (int)ev.getY();

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>=20 && dx>dy) {//左右滑动

isleftrightEvent = true;

isTestCompete = true;

}else if(dy>=20 && dy>dx){//上下滑动

isleftrightEvent = false;

isTestCompete = true;

}

break;

case MotionEvent.ACTION_UP:

break;

case MotionEvent.ACTION_CANCEL:

break;

default:

break;

}

}

加入左右滑动动画

修改MainUI

添加代码

public class MainUI extends RelativeLayout{

private Scroller mScroller;

public void initView(Context context){

//创建滑动动画

mScroller = new Scroller(context, new DecelerateInterpolator());

}

//事件分发

public boolean dispatchTouchEvent(MotionEvent ev) {

if (!isTestCompete) {

//判断什么事件

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

//手抬起时执行滑动动画

curScrollX = getScrollX();

if (Math.abs(curScrollX) > leftMenu.getMeasuredWidth() >> 1) {

//执行左右滑动

if (curScrollX < 0) {

//向右滑 出现左菜单

mScroller.startScroll(curScrollX, 0, -leftMenu.getMeasuredWidth()-curScrollX, 0);

}else{

//向左滑 出现右菜单

mScroller.startScroll(curScrollX, 0, leftMenu.getMeasuredWidth()-curScrollX, 0);

}

}else{

//返回原点

mScroller.startScroll(curScrollX, 0, -curScrollX, 0);

}

//刷新 执行重绘

invalidate();

break;

default:

break;

}

}

}

//执行回调方法

public void computeScroll() {

// TODO Auto-generated method stub

super.computeScroll();

if (!mScroller.computeScrollOffset()) {

return;

}

int tempX = mScroller.getCurrX();

scrollTo(tempX, 0);

}

}

添加点击事件

填充LeftMenu 新建class LeftMenu继承自Fragment

新建left.xml

<?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:orientation="vertical" >

<Button

android:layout_height="wrap_content"

android:layout_width="wrap_content"

        android:text="button"

android:id="@+id/button"/>

</LinearLayout>

public class LeftMenu extends Fragment{

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

// TODO Auto-generated method stub

View v = inflater.inflate(R.layout.left, container, false);

v.findViewById(R.id.button).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

System.out.println("hello jikexueyuan");

}

});

return v;

}

}

修改MainActivity

public class MainActivity extends Activity {

private MainUI mainUI;

private LeftMenu leftMenu;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mainUI = new MainUI(this);

setContentView(mainUI);

leftMenu = new LeftMenu();

getFragmentManager().beginTransaction().add(mainUI.LEFT_ID, leftMenu).commit();

}

}

修改MainUI

public class MainUI extends RelativeLayout{

public static final int LEFT_ID = 0xaabbcc;

public static final int MIDDLE_ID = 0xbbaacc;

public static final int RIGHT_ID = 0xaaccbb;

public void initView(Context context){

leftMenu.setId(LEFT_ID);

middleMenu.setId(MIDDLE_ID);

rightMenu.setId(RIGHT_ID);

}

private void getEventType(MotionEvent ev) {

switch (ev.getActionMasked()) {

case MotionEvent.ACTION_DOWN:

//处理点击事件

super.dispatchTouchEvent(ev);

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

//处理点击事件

super.dispatchTouchEvent(ev);

isleftrightEvent = false;

isTestCompete = false;

break;

default:

break;

}

}

添加蒙版效果

修改MainUI

private FrameLayout middleMask;//蒙版

public void initView(Context context){

middleMask = new FrameLayout(context);

middleMask.setBackgroundColor(0x88000000);

addView(middleMask);

middleMask.setAlpha(0);

}

public void scrollTo(int x, int y) {

// TODO Auto-generated method stub

super.scrollTo(x, y);

int curX = Math.abs(getScrollX());

float scale = curX/(float)leftMenu.getMeasuredWidth();

middleMask.setAlpha(scale);

}

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

middleMask.measure(widthMeasureSpec, heightMeasureSpec);

}

protected void onLayout(boolean changed, int l, int t, int r, int b) {

middleMask.layout(l, t, r, b);

}

时间: 2024-12-18 22:35:33

左右菜单的相关文章

树形菜单 jsTree 使用方法

jsTree版本:3.0.4 在ASP.NET MVC中使用jsTree Model: public class Department { public int Id { get; set; } public string Name { get; set; } public int PId { get; set; } } 数据库: Controller: jsTree既可以一次性把所有节点都加载到客户端,也可以只加载一层,点击节点后再去服务端获取下层节点.对于小的菜单可以一次性加载完,如果节点很

微信 小程序布局 水平菜单

<!-- 菜单列表部分 --> <view class="wear-menu"> <view class='menu-box' wx:key="menu" wx:for="{{menuList}}" wx:for-index="index"> <view class="menu-img" bindtap="selectMenu" data-ind

微信公众号菜单开发以及授权详细说明

主代码请参考:http://www.cnblogs.com/hopelooking/p/7463934.html 难点解析: 在微信创建菜单的时候我们惯用的是curl,但是菜单中难免是要有中文的,如果你的php版本是5.4版本的话,那么一定会报错的,主要错误原因是对象或者字符串之间的错误,那么我们在使用json_encode的时候就不能单纯的只是json一下了,应该json_encode($data,JSON_UNESCAPED_UNICODE) 例子: public function acti

第二百零八节,jQuery EasyUI,SplitButton(分割按钮菜单)组件

jQuery EasyUI,SplitButton(分割按钮)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 SplitButton(分割按钮)组件的使用方法,这个组件依赖 于 Menu(菜单)组件和 LinkButton(按钮)组件. 注意:SplitButton(分割按钮)组件与,MenuButton(菜单按钮)是一样的,不同是(分割按钮)组件多了一个分隔符 一加载方式 class 加载方式 <a href="javascript:void

第一百八十九节,jQueryUI,折叠菜单 UI

jQueryUI,折叠菜单 UI 学习要点: 1.使用 accordion 2.修改 accordion 样式 3.accordion()方法的属性 4.accordion()方法的事件 5.accordion 中使用 on 折叠菜单(accordion),和选项卡一样也是一种在同一个页面上切换不同内容的功能 UI.它和选项卡的使用几乎没有什么太大区别,只是显示的效果有所差异罢了. 一.使用 accordion 使用 accordion 比较简单,但需要按照指定的规范即可. HTML 部分 <d

在浏览器右键添加自定义菜单

在浏览器右键添加自定义菜单 Afly | 2006-11-8 其实就是类似当安装完 Flashget 后 Internet Explorer 的右键多了"使用网际快车下载"的选项一样,现在我们的需求是:当我们在图片右键时出现"复制图像地址"的选项. 其实很简单,先把下列代码存为 abc.reg 并导入: Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Interne

oracle使用connect by进行级联查询 树型菜单

Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥有一个菜单表t_menu,其中只有三个字段:id.name和parent_id.它们是具有父子关系的,最顶级的菜单对应的parent_id为0.现假设我们拥有如下记录: id name parent_id 1 菜单01 0 2 菜单02 0 3 菜单03 0 4 菜单0101 1 5 菜单0102

WinForm 多窗体、菜单和工具栏

今天,我首先先学习了一下在WinForm程序开发中常遇到的问题——多窗体程序运行问题. 在开发多窗体程序时,常会遇到以下四个方面的问题: 一.哪个是主窗体 问题:主窗体隐藏了,关闭其它窗体后,没有将主窗体显示/关闭,那么程序就关不上了. 当遇到这个问题时,我们通常的解决办法是:构造函数传值,将窗体传到另一个窗体中去,进行关闭. 二.窗体只能打开一个 创建一个全局的泛型集合,为了放置全部打开的窗体.在窗体打开之前,判断集合中是否有name一致的窗体,如果有就说明已经打开了,就不要再打开了. 问题:

Libgdx之国际化 中英文菜单切换

有时候我们做的游戏不仅仅发布在国内市场,有时候也需要发布在国际市场,这时候我们至少需要中英2套菜单来供不同的玩家使用,毕竟中文不是每个人都能看懂. Libgdx中提供了I18NBundle来供我们使用,I18NBundle提供了一套机制可以使我们从属性(properties)文件中加载资源, 属性文件中的资源是以"name"和"values"的形式存在的,而且资源最好有一个父文件,这样防止资源丢失时,可以使用父文件中的值: 通过上面图片可以看出string.prop

微信个性化菜单开发模式

最近一个礼拜搞了一个微信自定义菜单的开发,总的来说蛮郁闷的. 先给几个接口做下分析: 1:查询接口:查询接口分为两个,一个是开发模式下的普通查询接口,他只会查询出你通过添加接口创建出来的菜单和个性化的菜单(让公众号的不同用户群体看到不一样的自定义菜单),而不能获取到你通过微信管理平台添加的菜单.还有一个是可以查询全部菜单的接口,这个接口有点蛋疼,如果你先在平台上添加一个菜单,然后后台调用这个接口就可以获取到这个菜单,但调用这个接口的返回的json跟添加时的格式是不一样的(就是说你把它发回给你的j