欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android實現(xiàn)滑動側邊欄

 更新時間:2020年04月08日 11:40:43   作者:Joe_c  
這篇文章主要為大家詳細介紹了Android實現(xiàn)滑動側邊欄效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在Android應用開發(fā)中,滑動側邊欄經常使用,今天我也試著自己進行了一個簡單的實踐,雖然功能還不是很強大,但是可以保留下來為以后的開發(fā)使用,有需要時在進行簡單的修改。實現(xiàn)一個滑動側邊欄思路也很簡單:

1.重寫一個SlidingMenu類繼承ViewGroup,病危該ViewGroup添加兩個子布局,分別為菜單和主界面顯示;

2.為了得到一個滑動的效果,選擇Scroller幫助我們實現(xiàn),配合ViewGroup下的computeScroll方法實現(xiàn)界面的更新;

3.利用一個boolean來記錄菜單是否打開,在菜單打開的狀態(tài)下向右滑動不會響應,在菜單關閉的情況向左滑動不會響應;

4.為了得到一個良好的交互,我們可以為界面滑動與手指移動的距離定義一個比例,如每次觸摸事件發(fā)生,界面移動的距離僅為手指移動距離的一半;

下面是兩張效果圖,界面沒怎么布局,大家湊合看

SlidingMenu實現(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; 
  // 如果在菜單打開時向右滑動及菜單關閉時向左滑動不會觸發(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) {// 菜單關閉時 
  // 向右滑動超過menu一半寬度才會打開菜單 
  if (dx > menu.getMeasuredWidth() / 3) { 
   state = Scroll_State.Scroll_to_Open; 
  } else { 
   state = Scroll_State.Scroll_to_Close; 
  } 
  } else {// 菜單打開時 
  // 當按下時的觸摸點在menu區(qū)域時,只有向左滑動超過menu的一半,才會關閉 
  // 當按下時的觸摸點在main區(qū)域時,會立即關閉 
  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中進行調用

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(); 
  } 
 }); 
 } 
 
} 

更多關于滑動功能的文章,請點擊專題: 《Android滑動功能》

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Flutter數(shù)據庫的使用方法

    Flutter數(shù)據庫的使用方法

    這篇文章主要介紹了Flutter數(shù)據庫的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 移動端android上line-height不居中的問題的解決

    移動端android上line-height不居中的問題的解決

    現(xiàn)在越來越多的移動界面使用rem適配,最近發(fā)現(xiàn)了移動端android上line-height不居中的問題,今日就來介紹一下解決的方法,非常具有實用價值,需要的朋友可以參考下
    2018-03-03
  • Android全面屏與異形(劉海)屏的適配教程

    Android全面屏與異形(劉海)屏的適配教程

    Apple一直在引領設計的潮流,自從 iPhone X 發(fā)布之后,各種異形屏、劉海屏也都出來,下面這篇文章主要給大家分享介紹了關于Android全面屏與異形(劉海)屏的適配教程,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • 深入android中The connection to adb is down的問題以及解決方法

    深入android中The connection to adb is 

    本篇文章是對android中The connection to adb is down的問題以及解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Flutter app頁面路由以及路由攔截的實現(xiàn)

    Flutter app頁面路由以及路由攔截的實現(xiàn)

    本篇介紹了介紹了Flutter如何使用路由來實現(xiàn)頁面的跳轉,從而簡化頁面之間的耦合,并可以實現(xiàn)路由攔截。
    2021-06-06
  • Android App中ViewPager所帶來的滑動沖突問題解決方法

    Android App中ViewPager所帶來的滑動沖突問題解決方法

    Android中我們經常使用ViewPager配合Fragment實現(xiàn)視圖滑動,但在實際操作中又會經常發(fā)生方向上的沖突問題,這里我們就來總結一下Android App中ViewPager所帶來的滑動沖突問題解決方法:
    2016-06-06
  • Android split分割特殊字符取名稱的方法

    Android split分割特殊字符取名稱的方法

    這篇文章主要為大家詳細介紹了Android split分割特殊字符取名稱的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android實現(xiàn)上拉加載更多ListView(PulmListView)

    Android實現(xiàn)上拉加載更多ListView(PulmListView)

    這篇文章主要介紹了Android實現(xiàn)上拉加載更多ListView:PulmListView,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 關于Gradle下載失敗問題的快速解決方法

    關于Gradle下載失敗問題的快速解決方法

    這篇文章主要給大家分享了關于Gradle下載失敗問題的快速解決方法,文中介紹了兩種解決方法,分別是使用已存在的gradle版本和手動下載gradle,文中介紹的非常詳細,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Android中使用ViewStub實現(xiàn)布局優(yōu)化

    Android中使用ViewStub實現(xiàn)布局優(yōu)化

    ViewStub是Android布局優(yōu)化中一個很不錯的標簽/控件,直接繼承自View。雖然Android開發(fā)人員基本上都聽說過,但是真正用的可能不多。今天我們就來詳細探討下ViewStub的使用
    2016-09-09

最新評論