自定义左右侧滑菜单

实现效果:

  • 左右侧滑菜单,侧滑栏占主屏比为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;
	
	@Override
	protected 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();

	}

	/*
	 * 根据滑动改变蒙版的透明度
	 */
	@Override
	public void scrollTo(int x, int y) {
		super.scrollTo(x, y);
		int curX=Math.abs(getScrollX());
		float scale=curX/(float)leftMenu.getMeasuredWidth();
		middMask.setAlpha(scale);
	}

	/*
	 *绘制界面
	 */
	@Override
	protected 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);
	}
	@Override
	protected 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;
	@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);
				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);
	}

	@Override
	public 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity自带的菜单选项可以为开发人员提供快捷的功能,但是当我们需要一个更加专业化的菜单时,Unity的默认菜单选项可能无法满足需求。此时,自定义树形菜单就应运而生。 Unity的自定义树形菜单是基于EditorGUILayout的GUI实现的。首先,我们需要扩展Editor类并使用MenuCommand属性,以及EditorGUI类,来为自定义菜单添加菜单项和功能选项。然后,我们可以使用GUILayout实现垂直排列的树形菜单,在每个菜单项的后面添加子菜单。 接下来,我们应该为自定义菜单添加相应的功能。在每个菜单项中,我们可以通过EditorGUILayout实现按钮、文本框、下拉菜单等等,为每个功能选项设计对应的功能。比如,我们可以在菜单项中添加新的对象、展开/折叠所有对象、删除特定的对象等功能。 最后,我们需要重写OnGUI方法,在其中调用自己的菜单绘制函数。这样,在编辑器中打开自定义窗口时,我们就可以看到新的树形菜单和功能选项了。另外,我们要记得在Menu选项中添加自定义的扩展菜单,这样才能在编辑器菜单中添加自己的菜单项。 总而言之,Unity的自定义树形菜单功能可以让开发人员更加简便地实现自己的的菜单和功能选项。如果你想为Unity添加一些自定义的、专业化的菜单和功能选项,自定义树形菜单将是一个十分有效的解决方案。 ### 回答2: Unity是一款非常强大的游戏引擎,在其中可以进行大量的开发工作。其中,Unity提供了很多的功能和工具,其中就包括了自定义树形菜单。 在Unity中,树形菜单是一种非常方便的工具,可以让用户轻松地查看所有的功能和对象,并且方便进行管理。如果用户想要自定义树形菜单,可以按照以下的步骤进行操作: 1. 创建一个新的编辑器窗口,负责显示自定义树形菜单。 2. 在这个编辑器窗口中,可以使用GUILayout或者IMGUI等工具来自定义绘制。 3. 使用EditorApplication.hierarchyWindowChanged事件去监听当场景objectId的集合发生了改变时触发。 4. 使用UnityEditor.GUILayout.Popup方法样式,用户可以为每个节点添加下拉箭头。 5. 使用自定义GUILayout.Button方法样式,用户可以为每个节点添加列表中的按钮。 上述步骤是在Unity中自定义树形菜单的基本过程,用户可以根据自己的需求进行更改和调整。自定义树形菜单可以大大提高工作效率,让开发者更加方便地管理和操作游戏中的场景、对象和功能。 ### 回答3: Unity是一款十分强大的游戏引擎,是许多游戏制作人员所钟爱的工具。Unity自带的菜单栏虽然已经很强大,但是我们还是有时候需要自定义树形菜单,来更好的实现游戏中的各种功能。这里我们将介绍如何使用Unity自定义树形菜单。 首先,打开Unity的编辑器并打开项目。然后在项目中新建一个C#脚本,并将其命名为“CustomMenu.cs”。我们将在这个脚本中编写我们的树形菜单。 接下来,我们需要为我们的树形菜单设置一个名称。在“CustomMenu.cs”中,使用“[MenuItem(“Custom/MyMenu”)]”,产生一个名为“MyMenu”的菜单。 接下来,我们可以在Unity的编辑器中创建一个新的文件夹,将其命名为“Custom”,这个文件夹将成为我们创建的菜单的父级。 接下来,在“CustomMenu.cs”中,我们可以使用“[MenuItem(“Custom/MyMenu/Do Something”)]”创建菜单的子项,并添加相应的函数来实现这个子项的功能。 最后,在Unity中运行我们的项目,并点击菜单栏“Custom”选项,我们就可以看到我们刚刚创建的树形菜单了。当我们点击“MyMenu”时,会显示“Do Something”子项。当我们点击“Do Something”时,它将调用相应的函数并执行相应的操作。 综上所述,Unity自定义树形菜单的实现方法是很简单的。我们只需要编写一个包含菜单名称和相应函数的脚本即可。可以根据需要创建任意多的子项,并为它们添加相应的功能。自定义菜单能够帮助我们更好地实现游戏中的各种功能,提高我们的工作效率,让我们更加专注于游戏的创作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值