Android 侧滑重写HorizontalScrollView

来源:互联网 发布:朗文字典 for mac 编辑:程序博客网 时间:2024/05/16 05:20

一个简单的侧滑,主要是重写了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;}//设置空间的大小@Overrideprotected 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);}//设置控件的显示@Overrideprotected 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}}@Overridepublic 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的按钮@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initview();//按钮点击事件,设置menu的显示隐藏main_btn.setOnClickListener(new OnClickListener() {@Overridepublic 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 0