Android自定义HorizontalScrollView实现qq侧滑菜单

今天看了鸿洋_大神在慕课网讲的qq5.0侧滑菜单。学了不少的知识,同时也佩服鸿洋_大神思路的清晰。

看了教程课下也自己实现了一下。代码几乎完全相同  别喷我啊。。没办法 o(︶︿︶)o 唉

像素不好 没办法 找不到好的制作gif的软件。

我们暂且称侧滑左边界面的为menu,右边为content

首先是menu的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:background="@drawable/img_frame_background" >
 <LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:layout_centerInParent="true"
 android:orientation="vertical" >
 <RelativeLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content" >
 <ImageView
 android:id="@+id/image1"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/img_1" />
 <TextView
 android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/image1"
 android:textColor="#ffffff"
 android:layout_marginLeft="20dp"
 android:text="第一个Item"
 android:textSize="20sp" />
 </RelativeLayout>
 <RelativeLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >
 <ImageView
 android:id="@+id/image2"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/img_2" />
 <TextView
 android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/image2"
 android:textColor="#ffffff"
 android:layout_marginLeft="20dp"
 android:text="第二个Item"
 android:textSize="20sp" />
 </RelativeLayout>
 <RelativeLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >
 <ImageView
 android:id="@+id/image3"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/img_3" />
 <TextView
 android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/image3"
 android:textColor="#ffffff"
 android:layout_marginLeft="20dp"
 android:text="第三个Item"
 android:textSize="20sp" />
 </RelativeLayout>
 <RelativeLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >
 <ImageView
 android:id="@+id/image4"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/img_4" />
 <TextView
 android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/image4"
 android:textColor="#ffffff"
 android:layout_marginLeft="20dp"
 android:text="第四个Item"
 android:textSize="20sp" />
 </RelativeLayout>
<RelativeLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >
<ImageView
 android:id="@+id/image5"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/img_5" />
<TextView
 android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/image5"
 android:textColor="#ffffff"
 android:layout_marginLeft="20dp"
 android:text="第五个Item"
 android:textSize="20sp" />
 </RelativeLayout>
 </LinearLayout>
</RelativeLayout>

然后是主布局,一个水平滚动条,放入menu.xml,然后下面是一个线性垂直布局,背景是qq图片

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent" >
<com.example.myhorizontalscrollview.MyHorizontalScrollView
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:scrollbars="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="@drawable/qq" />
 </LinearLayout> </com.example.myhorizontalscrollview.MyHorizontalScrollView>
</RelativeLayout>

其中的水平滚动条是我们自定义的view

需要重写其中的两个方法

@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);
} 

通过设置偏移量,调整我们的初始布局,使menu全部隐藏,右侧菜单显现

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 // TODO Auto-generated method stub
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} 

设置子view的宽

     * 因为HorizontalScrollView自己控制move和down的事件

     * 所以我们还要通过onTouchEvent判断一下up.如果当前的x偏移量大于menu宽度的一半

     * 隐藏menu,否则显示menu 显示的时候通过smoothScrollTo(x, y)方法来实现动画的效果

下面是所有的自定义的HorizontalScrollView

package com.example.myhorizontalscrollview;
import android.annotation.SuppressLint;
import android.content.Context;
import android.text.GetChars;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
public class MyHorizontalScrollView extends HorizontalScrollView {
 //滚动条中的水平先行布局
 private LinearLayout mWrpper;
 //水平线性布局的左侧菜单menu
 private ViewGroup mMenu;
 //水平先行布局的右侧线性布局
 private ViewGroup mContent;
 //屏幕的宽
 private int mScreenWidth;
 //menu的宽离屏幕右侧的距离
 private int mMenuRightPadding=50;
 //menu的宽度
 private int mMenuWidth;
 private boolean once; 

 /**
 * 未使用自定义属性时调用
 * */
 public MyHorizontalScrollView(Context context, AttributeSet attrs) {
 super(context, attrs);
 /*
 * 获取屏幕的宽度
 * 通过context拿到windowManager,在通过windowManager拿到Metrics,用DisplayMetrics接收
 * */
 WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
 DisplayMetrics outMetrics = new DisplayMetrics();
 wm.getDefaultDisplay().getMetrics(outMetrics);
 mScreenWidth=outMetrics.widthPixels;
 //把dp转换成px
 mMenuRightPadding=(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50,
 context.getResources().getDisplayMetrics());
 }
 /*
 * 设置子view的宽和高
 * */
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 // TODO Auto-generated method stub
 if(!once){
 mWrpper=(LinearLayout) getChildAt(0);
 mMenu=(ViewGroup) mWrpper.getChildAt(0);
 mContent=(ViewGroup) mWrpper.getChildAt(1);
 //menu的宽度等于屏幕的宽度减去menu离屏幕右侧的边距
 mMenuWidth=mMenu.getLayoutParams().width=mScreenWidth-mMenuRightPadding;
 //右边的先行布局的宽度直接等于屏幕的宽度
 mContent.getLayoutParams().width=mScreenWidth;
 once=true;
 }
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }
 /*
 * 通过设置偏移量将menu隐藏
 * */
 @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);
 /*
 * 通过scrollTo(x,y)方法设置屏幕的偏移量,x为正
 * 内容向左移动
 * */
 if(changed){
 this.scrollTo(mMenuWidth, 0);
 }
 }
 /*
 * 因为HorizontalScrollView自己控制move和down的事件
 * 所以我们还要判断一下up.如果当前的x偏移量大于menu宽度的一半
 * 隐藏menu,否则显示menu
 * */
 @Override
 public boolean onTouchEvent(MotionEvent ev) {
 // TODO Auto-generated method stub
 int action=ev.getAction();
 switch(action){
 case MotionEvent.ACTION_UP:
 int scrollX=getScrollX();
 if(scrollX>=mMenuWidth/2){
 this.smoothScrollTo(mMenuWidth, 0);
 }
 else{
 this.smoothScrollTo(0, 0);
 }
 return true;
 }
 return super.onTouchEvent(ev);
 }
}

然后就是MainActivity加载布局就可以

package com.example.slipping;
import com.example.helloworld.R;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • Android中实现多行、水平滚动的分页的Gridview实例源码

    功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现. (2)水平滚动翻页,下面有显示当前页的icon. 1.实现自定义的HorizontalScrollView(HorizontalScrollView.java): 因为要翻页时需要传当前页给调用者,所以fling函数中自己

  • Android HorizontalScrollView内子控件横向拖拽实例代码

    前言 网上ListView上下拖动的例子有,效果也很好,但是项目要横着拖的,只要硬着头皮自己写(主要是没找到合适的),参考文章1修改而来,分享一下. 正文 截图 实现代码: public class HoDragActivity extends Activity { private LinearLayout main; private GestureDetector mGestureDetector; @Override public void onCreate(Bundle savedInst

  • Android使用自定义控件HorizontalScrollView打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现:多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最简单的一种实现~~~ 1.原理分析 既然是侧滑,无非就是在巴掌大的屏幕,塞入大概两巴掌大的布局,需要滑动可以出现另一个,既然这样,大家为啥不考虑使用Android

  • Android中HorizontalScrollView使用方法详解

    由于移动设备物理显示空间一般有限,不可能一次性的把所有要显示的内容都显示在屏幕上.所以各大平台一般会提供一些可滚动的视图来向用户展示数据.Android平台框架中为我们提供了诸如ListView.GirdView.ScrollView等滚动视图控件,这几个视图控件也是我们平常使用最多的.下面介绍一下HorizontalScrollView的使用和需要注意的点:  HorizontalScrollView是一个FrameLayout  ,这意味着你只能在它下面放置一个子控件,这个子控件可以包含很多

  • Android HorizontalScrollView左右滑动效果

    本文实例为大家分享了Android HorizontalScrollView左右滑动的具体代码,供大家参考,具体内容如下 效果图 一.什么是HorizontalScrollView HorizontalScrollView实际上是一个FrameLayout ,这意味着你只能在它下面放置一个子控件 ,这个子控件可以包含很多数据内容.有可能这个子控件本身就是一个布局控件,可以包含非常多的其他用来展示数据的控件.这个布局控件一般使用的是一个水平布局的LinearLayout.TextView也是一个可

  • android listview 水平滚动和垂直滚动的小例子

    网上有很多解决 android listview 水平和垂直滚动的代码,我没有按照他们说的做(以前没搜到 O(∩_∩)O~) 我采用的是添加HorizontalScrollViewJava代码 复制代码 代码如下: < ScrollView android:id="@+id/ScrollView01" android:layout_height="300px" android:layout_x="16px" android:layout_y

  • Android利用HorizontalScrollView仿ViewPager设计简单相册

    最近学习了一个视频公开课,讲到了利用HorizontalScrollView仿ViewPager设计的一个简单相册,其实主要用了ViewPager缓存的思想.此篇文章参考:Android自定义HorizontalScrollView打造超强Gallery效果(这篇文章与公开课的讲的大致一样) 这里简单说一下ViewPager的缓存机制 1.进入ViewPager时,加载当前页和后一页: 2.当滑动ViewPager至下一页时,加载后一页,此时第一页是不会销毁的,同时加载当前页的下一页. 其实就是

  • HorizontalScrollView水平滚动控件使用方法详解

    一.简介 用法ScrollView大致相同 二.方法 1)HorizontalScrollView水平滚动控件使用方法 1.在layout布局文件的最外层建立一个HorizontalScrollView控件 2.在HorizontalScrollView控件中加入一个LinearLayout控件,并且把它的orientation设置为horizontal 3.在LinearLayout控件中放入多个装有图片的ImageView控件 2)HorizontalScrollView和ScrollVie

  • Android UI系列-----ScrollView和HorizontalScrollView的详解

    本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是一个水平方向的可以滚动的View.本篇随笔可能描述性的知识比较少,最主要还是通过代码来看看如何使用这两个View. 一.ScrollView的简单介绍 首先来看看ScrollView和HorizontalScrollV

  • Android自定义HorizontalScrollView打造超强Gallery效果

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会OOM(ViewPager内

随机推荐