欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

自定義SlidingMenu組件 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

自定義SlidingMenu組件

發(fā)表時(shí)間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):36


在網(wǎng)上進(jìn)修了自定義slidingmenu組件,這里記錄下個(gè)中的關(guān)鍵點(diǎn)。
SlidingMenu其實(shí)是一個(gè)HorizontalScrollView,瑯綾擎有兩個(gè)構(gòu)造,經(jīng)由過程重寫幾個(gè)辦法達(dá)到側(cè)滑的效不雅。
起首道理是在LinearLayout外嵌套了HorizontalScrollView,SlidingMenu持續(xù)HorizontalScrollView。
重寫onMeasure(int widthMeasureSpec, int heightMeasureSpec),onLayout(boolean changed, int l, int t, int r, int b),onTouchEvent(MotionEvent ev)辦法
下面是代碼
package com.example.slidingmenudemo.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;

import com.example.slidingmenudemo.R;
import com.example.slidingmenudemo.utils.ScreenUtils;
import com.nineoldandroids.view.ViewHelper;

public class SlidingMenu extends HorizontalScrollView {

	// 屏幕的寬度
	private int mScreenWidth;
	// 菜單的寬度
	private int mMenuWidth;
	// 一半菜單的寬度
	private int mHalfMenuWidth;
	// 菜單距離右側(cè)的寬度(像素)
	private int mMenuRightPadding;
	// 菜單距離右側(cè)的寬度(dp)
	private float mDefaultMenuRightPaddingDp = 150f;
	// 是否第一次加載
	private boolean firstIn = true;
	private boolean isOpen = false;
	private ViewGroup menu;
	private ViewGroup content;

	public SlidingMenu(Context context, AttributeSet attrs) {
		super(context, attrs);
		mScreenWidth = ScreenUtils.getScreenWidth(context);

		TypedArray typedArray = context.obtainStyledAttributes(attrs,
				R.styleable.SlidingMenu);
		int n = typedArray.getIndexCount();
		for (int i = 0; i < n; i++) {
			int attr = typedArray.getIndex(i);
			switch (attr) {
			case R.styleable.SlidingMenu_rightPadding:
				mMenuRightPadding = typedArray.getDimensionPixelOffset(attr,
						ScreenUtils.dp2px(context, mDefaultMenuRightPaddingDp));
				break;
			}
		}
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// 如不雅是第一次加載,要對(duì)每個(gè)構(gòu)造(Menu,Content)的寬度從新設(shè)定(留意都是像素為單位)
		if (firstIn) {
			LinearLayout wrapper = (LinearLayout) getChildAt(0);
			menu = (ViewGroup) wrapper.getChildAt(0);
			content = (ViewGroup) wrapper.getChildAt(1);

			mMenuWidth = mScreenWidth - mMenuRightPadding;
			mHalfMenuWidth = mMenuWidth / 2;
			menu.getLayoutParams().width = mMenuWidth;
			content.getLayoutParams().width = mScreenWidth;
		}
		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(mMenuWidth, 0);
			firstIn = false;
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		ev.getAction();
		switch (ev.getAction()) {
		case MotionEvent.ACTION_UP:
			if (getScrollX() > mHalfMenuWidth) {
				// 打開菜單
				this.smoothScrollTo(mMenuWidth, 0);
				isOpen = true;
			} else {
				// 封閉菜單
				this.smoothScrollTo(0, 0);
				isOpen = false;
			}
			return true;

		}
		return super.onTouchEvent(ev);
	}

	// 打開Menu
	public void openMenu() {
		if (!isOpen) {
			this.smoothScrollTo(0, 0);
			isOpen = true;
		}
	}

	// 打開Menu
	public void closeMenu() {
		if (isOpen) {
			this.smoothScrollTo(mMenuWidth, 0);
			isOpen = false;
		}
	}

	// 切換菜單狀況
	public void toggle() {
		if (isOpen) {
			this.smoothScrollTo(mMenuWidth, 0);
			isOpen = false;
		} else {
			this.smoothScrollTo(0, 0);
			isOpen = true;
		}
	}
}

attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="SlidingMenu">
        <attr name="rightPadding" format="dimension"></attr>
    </declare-styleable>

</resources>

構(gòu)造main.xml
<com.example.slidingmenudemo.widget.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:menu="http://schemas.android.com/apk/res/com.example.slidingmenudemo"
    android:id="@+id/menu"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:scrollbars="none"
    menu:rightPadding="150dp" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >

        <include layout="@layout/layout_menu" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@drawable/qq" >
        </LinearLayout>
    </LinearLayout>

</com.example.slidingmenudemo.widget.SlidingMenu>

要留意的幾點(diǎn):
1.代碼的操作都是用的px,所以要把dp轉(zhuǎn)成像素進(jìn)行計(jì)算,這里謝了
2.HorizontalScrollView的smoothScrollTo(mMenuWidth, 0)辦法跳到開端content構(gòu)造中
3.重寫onMeasure()中對(duì)menu和content構(gòu)造的寬度都進(jìn)行了從新的設(shè)定,這里menu距離右側(cè)距離是一個(gè)自定義屬性
創(chuàng)建自定義組件的步調(diào):
一.寫構(gòu)造
二寫java類,一般名字就是自定義組件的名字,在這里寫對(duì)構(gòu)造一一些器械操作
三.如不雅須要自定義屬性,先在attr.xml中聲明一個(gè)類似這種的屬性參數(shù),寫清跋扈每個(gè)屬性的名字和類型
<declare-styleable name="SlidingMenu">
        <attr name="rightPadding" format="dimension"></attr>
    </declare-styleable>
四.在自定義組件中獲取構(gòu)造文件中寫的自定義屬性
<pre name="code" class="java">		TypedArray typedArray = context.obtainStyledAttributes(attrs,
				R.styleable.SlidingMenu);
		int n = typedArray.getIndexCount();
		for (int i = 0; i < n; i++) {
			int attr = typedArray.getIndex(i);
			switch (attr) {
			case R.styleable.SlidingMenu_rightPadding:
				mMenuRightPadding = typedArray.getDimensionPixelOffset(attr,
						ScreenUtils.dp2px(context, mDefaultMenuRightPaddingDp));
				break;
			}
		}


這個(gè)代碼很固定,記住吧,或者慢慢來。



四.構(gòu)造中記得加上自定義屬性的定名空間
xmlns:menu="http://schemas.android.com/apk/res/com.example.slidingmenudemo"

源代碼根本上都在膳綾擎了,有過有須要項(xiàng)目代碼的,請(qǐng)留下郵箱,我看到后會(huì)發(fā)以前。

相關(guān)案例查看更多