在Android應(yīng)用開(kāi)發(fā)中,滑動(dòng)側(cè)邊欄經(jīng)常使用,今天我也試著自己進(jìn)行了一個(gè)簡(jiǎn)單的實(shí)踐,雖然功能還不是很強(qiáng)大,但是可以保留下來(lái)為以后的開(kāi)發(fā)使用,有需要時(shí)在進(jìn)行簡(jiǎn)單的修改。實(shí)現(xiàn)一個(gè)滑動(dòng)側(cè)邊欄思路也很簡(jiǎn)單:
在安陽(yáng)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站,成都外貿(mào)網(wǎng)站制作,安陽(yáng)網(wǎng)站建設(shè)費(fèi)用合理。
1.重寫一個(gè)SlidingMenu類繼承ViewGroup,病危該ViewGroup添加兩個(gè)子布局,分別為菜單和主界面顯示;
2.為了得到一個(gè)滑動(dòng)的效果,選擇Scroller幫助我們實(shí)現(xiàn),配合ViewGroup下的computeScroll方法實(shí)現(xiàn)界面的更新;
3.利用一個(gè)boolean來(lái)記錄菜單是否打開(kāi),在菜單打開(kāi)的狀態(tài)下向右滑動(dòng)不會(huì)響應(yīng),在菜單關(guān)閉的情況向左滑動(dòng)不會(huì)響應(yīng);
4.為了得到一個(gè)良好的交互,我們可以為界面滑動(dòng)與手指移動(dòng)的距離定義一個(gè)比例,如每次觸摸事件發(fā)生,界面移動(dòng)的距離僅為手指移動(dòng)距離的一半;
下面是兩張效果圖,界面沒(méi)怎么布局,大家湊合看


SlidingMenu實(shí)現(xiàn)代碼:
package com.example.test;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;
public class SlidingMenu extends ViewGroup {
private static final String TAG = SlidingMenu.class.getName();
private enum Scroll_State {
Scroll_to_Open, Scroll_to_Close;
}
private Scroll_State state;
private int mMostRecentX;
private int downX;
private boolean isOpen = false;
private View menu;
private View mainView;
private Scroller mScroller;
private OnSlidingMenuListener onSlidingMenuListener;
public SlidingMenu(Context context, View main, View menu) {
super(context);
// TODO Auto-generated constructor stub
setMainView(main);
setMenu(menu);
init(context);
}
private void init(Context context) {
mScroller = new Scroller(context);
}
@Override
protected void onLayout(boolean arg0, int l, int t, int r, int b) {
// TODO Auto-generated method stub
mainView.layout(l, t, r, b);
menu.layout(-menu.getMeasuredWidth(), t, 0, b);
}
public void setMainView(View view) {
mainView = view;
addView(mainView);
}
public void setMenu(View view) {
menu = view;
addView(menu);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mainView.measure(widthMeasureSpec, heightMeasureSpec);
menu.measure(widthMeasureSpec - 150, heightMeasureSpec);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mMostRecentX = (int) event.getX();
downX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getX();
int deltaX = mMostRecentX - moveX;
// 如果在菜單打開(kāi)時(shí)向右滑動(dòng)及菜單關(guān)閉時(shí)向左滑動(dòng)不會(huì)觸發(fā)Scroll事件
if ((!isOpen && (downX - moveX) < 0)
|| (isOpen && (downX - moveX) > 0)) {
scrollBy(deltaX / 2, 0);
}
mMostRecentX = moveX;
break;
case MotionEvent.ACTION_UP:
int upX = (int) event.getX();
int dx = upX - downX;
if (!isOpen) {// 菜單關(guān)閉時(shí)
// 向右滑動(dòng)超過(guò)menu一半寬度才會(huì)打開(kāi)菜單
if (dx > menu.getMeasuredWidth() / 3) {
state = Scroll_State.Scroll_to_Open;
} else {
state = Scroll_State.Scroll_to_Close;
}
} else {// 菜單打開(kāi)時(shí)
// 當(dāng)按下時(shí)的觸摸點(diǎn)在menu區(qū)域時(shí),只有向左滑動(dòng)超過(guò)menu的一半,才會(huì)關(guān)閉
// 當(dāng)按下時(shí)的觸摸點(diǎn)在main區(qū)域時(shí),會(huì)立即關(guān)閉
if (downX < menu.getMeasuredWidth()) {
if (dx < -menu.getMeasuredWidth() / 3) {
state = Scroll_State.Scroll_to_Close;
} else {
state = Scroll_State.Scroll_to_Open;
}
} else {
state = Scroll_State.Scroll_to_Close;
}
}
smoothScrollto();
break;
default:
break;
}
return true;
}
private void smoothScrollto() {
int scrollx = getScrollX();
switch (state) {
case Scroll_to_Close:
mScroller.startScroll(scrollx, 0, -scrollx, 0, 500);
if (onSlidingMenuListener != null && isOpen) {
onSlidingMenuListener.close();
}
isOpen = false;
break;
case Scroll_to_Open:
mScroller.startScroll(scrollx, 0,
-scrollx - menu.getMeasuredWidth(), 0, 500);
if (onSlidingMenuListener != null && !isOpen) {
onSlidingMenuListener.close();
}
isOpen = true;
break;
default:
break;
}
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), 0);
}
invalidate();
}
public void open() {
state = Scroll_State.Scroll_to_Open;
smoothScrollto();
}
public void close() {
state = Scroll_State.Scroll_to_Close;
smoothScrollto();
}
public boolean isOpen() {
return isOpen;
}
public void setOnSlidingMenuListener(
OnSlidingMenuListener onSlidingMenuListener) {
this.onSlidingMenuListener = onSlidingMenuListener;
}
public interface OnSlidingMenuListener {
public void open();
public void close();
}
} 在MainActivity中進(jìn)行調(diào)用
package com.example.test;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button openButton;
private Button closeButton;
private SlidingMenu mSlidingMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSlidingMenu = new SlidingMenu(this, LayoutInflater
.from(this).inflate(R.layout.fragment1, null), LayoutInflater
.from(this).inflate(R.layout.fragment2, null));
setContentView(mSlidingMenu);//注意setContentView需要換為我們的SlidingMenu
openButton = (Button) findViewById(R.id.button1);
closeButton = (Button) findViewById(R.id.button_close);
openButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
mSlidingMenu.open();
}
});
closeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
mSlidingMenu.close();
}
});
}
}
更多關(guān)于滑動(dòng)功能的文章,請(qǐng)點(diǎn)擊專題: 《Android滑動(dòng)功能》
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
標(biāo)題名稱:Android實(shí)現(xiàn)滑動(dòng)側(cè)邊欄
分享地址:http://www.chinadenli.net/article32/gccssc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作、外貿(mào)建站、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)