Android 侧滑重写HorizontalScrollView

一个简单的侧滑,主要是重写了HorizontalScrollView,非常简单,我就不一一述说了,直接上代码,有不懂的可以留言,不过我得注释写的很清楚,大家应该都能看得懂,


下面就直接上代码,


重写HorizontalScrollView

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

public class LeftMenu extends HorizontalScrollView {

	Context context;

	int width;// 屏幕的宽度
	int left_width;// menu宽度
	int scrolWidth;//滚动的宽度
	
	boolean isOpen;//判断侧滑菜单是否显示

	public LeftMenu(Context context) {
		super(context);
		this.context = context;
	}

	public LeftMenu(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
	}

	public LeftMenu(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		this.context = context;
	}

	//设置空间的大小
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		//获取屏幕的宽度
		WindowManager wm = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);
		DisplayMetrics outMetrics = new DisplayMetrics();
		wm.getDefaultDisplay().getMetrics(outMetrics);
		width = outMetrics.widthPixels;
		left_width = (int) (width * 0.8);
		scrolWidth = (int)(left_width/2);

		LinearLayout wrapper = (LinearLayout) getChildAt(0);
		ViewGroup leftmenu = (ViewGroup) wrapper.getChildAt(0);
		ViewGroup content = (ViewGroup) wrapper.getChildAt(1);

		leftmenu.getLayoutParams().width = left_width;//设置leftmenu的宽度
		content.getLayoutParams().width = width;//设置正文的宽度

		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}
	
	//设置控件的显示
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);
		
		if(changed){
			this.scrollTo(left_width, 0);//隐藏leftmenu
		}
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		int action = ev.getAction();
		switch (action) {
		case MotionEvent.ACTION_UP:
			int scrollX = getScrollX();
			//如果显示区域大于菜单宽度一半则完全显示,否则隐藏
			if(scrollX >= scrolWidth){
				this.smoothScrollTo(left_width, 0);
				isOpen = false;
			}else{
				this.smoothScrollTo(0, 0);
				isOpen = true;
				
			}
			break;
		}
		return super.onTouchEvent(ev);
	}
	
	//判断leftmenu的显示隐藏,主要用于外部按钮的设置menu的显示隐藏
	public void openMenu() {
		if(isOpen){
			this.smoothScrollTo(left_width, 0);
			isOpen = false;
		}else{
			this.smoothScrollTo(0, 0);
			isOpen = true;
		}

	}

}


xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.ceshi.LeftMenu
        android:id="@+id/main_hsv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="horizontal" >
            <LinearLayout 
                android:id="@+id/main_menu"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:background="#ff0000"
                ></LinearLayout>
            
            <LinearLayout 
                android:id="@+id/main_centext"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:background="#000000"
                >
                <Button 
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="打开"
                    android:id="@+id/main_btn"
                    />
            </LinearLayout>
            
        </LinearLayout>
    </com.example.ceshi.LeftMenu>

</LinearLayout>

Activity的实现

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

	LeftMenu main_hsv;//滚动条
	LinearLayout main_menu;//左侧菜单
	LinearLayout main_centext;//正文
	Button main_btn;//显示和隐藏menu的按钮

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initview();

		//按钮点击事件,设置menu的显示隐藏
		main_btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				main_hsv.openMenu();

			}
		});
	}

	//实例化控件
	private void initview() {
		main_hsv = (LeftMenu) this.findViewById(R.id.main_hsv);
		main_menu = (LinearLayout) this.findViewById(R.id.main_menu);
		main_centext = (LinearLayout) this.findViewById(R.id.main_centext);
		main_btn = (Button) this.findViewById(R.id.main_btn);

	}

}


资源下载


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值