1、视图

activity_main.xml

 <com.zyhui.cehua.SlidingMenu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/menu"
android:background="#ffffff"
android:scrollbars="none"
android:fadingEdge="none"
> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<include layout="@layout/menu" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#0000ff"
> </LinearLayout>
</LinearLayout> </com.zyhui.cehua.SlidingMenu>

menu.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00ff00"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="abc"
/> </LinearLayout>

2、清单文件

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zyhui.cehua"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="16" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.zyhui.cehua.MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

3、MainActivity

 package com.zyhui.cehua;

 import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity; public class MainActivity extends Activity {
private SlidingMenu sdMenu;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); sdMenu = (SlidingMenu) findViewById(R.id.menu);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sdMenu.goLeft();
}
});
} }

4、SlidingMenu

 package com.zyhui.cehua;

 import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;

  

//===================================================
//自定义控件的一般套路:
//1、重新父类的构造器
//2、视情况重写onMeasure、onLayout、onDraw和onTouchEvent方法
// onMeasure方法:测试自身及子控件尺寸的.它会调用setMeasureDimension方法
// onLayout方法:对自身及子控件进行布局是调用.它会调用layout方法
//===================================================

 //HorizontalScrollView可以参考这个http://www.xuebuyuan.com/2162142.html地址
public class SlidingMenu extends HorizontalScrollView {
private ViewGroup mMenu;
private ViewGroup mMain;
private int mRightPadding = 0;
private int mScreenWidth;
private int mMenuWidth;
private float downX;
    //为什么要第二个参数的构造器?因为需要xml文件的属性设置载入
public SlidingMenu(Context context, AttributeSet attrs) {
super(context, attrs); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics); //屏幕宽
mScreenWidth = outMetrics.widthPixels;
} //此方法是可以设置控件的宽高
    //什么时候会调用该方法?答:当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
LinearLayout wrapper = (LinearLayout) getChildAt(0);
mMenu = (ViewGroup) wrapper.getChildAt(0);
mMain = (ViewGroup) wrapper.getChildAt(1); //菜单宽度
mMenuWidth = mScreenWidth - mRightPadding;
mMenu.getLayoutParams().width = mMenuWidth;//设置菜单宽度 //主界面宽度
mMain.getLayoutParams().width = mScreenWidth; super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} @Override
public boolean onTouchEvent(MotionEvent ev) {
switch(ev.getAction()){
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
break;
case MotionEvent.ACTION_UP:
int d = (int) (ev.getX() - downX);
//往左
if(d < 0){
this.smoothScrollTo(mMenuWidth, 0);
}else{//往右
this.smoothScrollTo(0, 0);
}
break;
default:
break;
}
return true;
} //决定视图的摆放位置
    //onLayout叫做布局方法;它是在调用onMeasure后调用,可以看这个链接的开头:http://blog.csdn.net/yhb5566/article/details/7327075
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
this.scrollBy(mMenuWidth, 0);
} public void goLeft(){
this.smoothScrollTo(mMenuWidth, 0);
} }

更加完善的效果可以参考此人博客:http://www.cnblogs.com/lichenwei/p/4111252.html?utm_source=tuicool&utm_medium=referral

侧滑UI的更多相关文章

  1. Android UI(五)云通讯录项目之联系人列表,带侧滑选择,带搜索框

    作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节.交流QQ群:[编程之美 365234583]h ...

  2. iOS开发UI篇--一个侧滑菜单SlidingMenu

    一.简介 侧滑菜单已经成为app一个极常用的设计,不管是事务类,效率类还是生活类app.侧滑菜单因Path 2.0和Facebook为开发者熟知,国内目前也有很多流行app用到了侧滑菜单,比如QQ.网 ...

  3. 【Android UI】侧滑栏的使用(HorizontalScrollView控件的使用)

    主要的用到的控件:HorizontalScrollView 主要的功能:把几张图片解析成一张图片,在一个容器中呈现. 布局文件xml side_bar_scollview.xml//显示view的容器 ...

  4. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

  5. 这是一个比较全的Android UI 组件

     Android组件及UI框架大全 原文地址:http://blog.csdn.net/smallnest/article/details/38658593 Android 是目前最流行的移动操作系统 ...

  6. [安卓] 17、一个简单的例子学安卓侧滑设计——用开源slidingmenu

    效果如下: 下面是工程结构: 整个工程包括android-v7.SlidingMenu-lib和主工程SlidingMenuTest部分 其中前两个作为lib,后一个为主工程 主工程包含两个lib工程 ...

  7. Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)

    上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中 ...

  8. Android酷炫实用的开源框架(UI框架)

    Android酷炫实用的开源框架(UI框架) 前言 忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮 ...

  9. [iOS UI设计笔记整理汇总]

    8.UIsearchbar放到Navigationbar 上(意思是建个View作为titleview) //此处调用的是第三方封装的SearchBar,也可以自定义. self.searchBarW ...

随机推荐

  1. Android测试TestSuite的执行方法

    public class StartTest extends InstrumentationTestRunner {         public  TestSuite getAllTests() { ...

  2. Dating with girls(1)(二分+map+set)

    Dating with girls(1) Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. jdbc操作步骤和preparedStatment相比Statment的好处

    java操纵数据库封装了一组API,通过这组API可以透明的操作各种数据库,一般来讲,操纵数据库的步骤是: 一. try{ 1.加载数据库驱动 Class.forName("数据库驱动类&q ...

  4. json数据的获取(网络摘抄)

    一个简单的对象: $.ajax({ type: "post", url: "Handler.ashx", dataType: "html", ...

  5. C指针陷阱

    问题一: #include <stdio.h> int main(int argc, char *argv[]) { ]={ ,,,, }; ); printf(),*(p-)); ; } ...

  6. 第一个processing程序(2016-01-15)

    前几天下载和安装了最新的 processing,今天试一下,哈哈,真是简单之极啊,果然是给非程序员使用的,现在,我也是非程序员了.

  7. Longest Palindromic Substring - 一题多解

    题意是寻找一个字符串的最大回文字串,最简单的是n3方的算法,由于字符串最大长度为1000,所以这个方法很危险而且不科学. 紧接着想到的是一个n方的算法:回文子串是从中间向两边产生的,那么对于每个字符考 ...

  8. 谓词--Predicate

    去苹果的的技术官网搜索-Predicate就会找到相关的文档-Predicate Programming Guide 1,创建谓词时 %@是变量时不加单双引号,常量是加单引号,加双引号需要转义符号\ ...

  9. Android 6.0 新特性 整理 资料来自网络

    Android 6.0新特性 Runtime Permissions Doze and App Standby Apache HTTP Client Removal BoringSSL Access ...

  10. sublime2/3自总结经常使用快捷键(2的居多)

    Ctrl+D 选词 (重复按快捷键,就可以继续向下同一时候选中下一个同样的文本进行同一时候编辑) Ctrl+鼠标左键 能够同一时候选择要编辑的多处文本 Shift+鼠标右键(或使用鼠标中键)能够用鼠标 ...