知識(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í)提供便捷的支持!
自定義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)案例查看更多
相關(guān)閱讀
- 大理小程序開發(fā)
- 英文網(wǎng)站建設(shè)公司
- 開發(fā)制作小程序
- 報(bào)廢車拆解系統(tǒng)
- 汽車拆解管理軟件
- 二叉樹
- 網(wǎng)絡(luò)公司排名
- 安家微信小程序
- 正規(guī)網(wǎng)站建設(shè)公司
- 高端網(wǎng)站建設(shè)公司
- 云南做百度小程序的公司
- 云南網(wǎng)站設(shè)計(jì)
- 網(wǎng)站制作
- 微信分銷
- 百度排名
- 軟件定制公司
- 昆明做網(wǎng)站
- 報(bào)廢車回收
- 網(wǎng)站建設(shè)選
- 霸屏推廣
- 開通微信小程序被騙
- 網(wǎng)絡(luò)公司聯(lián)系方式
- 云南網(wǎng)站建設(shè)哪家強(qiáng)
- 網(wǎng)站建設(shè)招商
- 報(bào)廢車拆解管理系統(tǒng)
- 云南軟件開發(fā)
- 網(wǎng)站維護(hù)
- 汽車回收管理系統(tǒng)
- 云南網(wǎng)站建設(shè)服務(wù)公司
- 貴州小程序開發(fā)