最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實(shí)現(xiàn)滑動(dòng)側(cè)邊欄

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

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

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

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

3.利用一個(gè)boolean來記錄菜單是否打開,在菜單打開的狀態(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)距離的一半;

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

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; 
  // 如果在菜單打開時(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)超過menu一半寬度才會(huì)打開菜單 
  if (dx > menu.getMeasuredWidth() / 3) { 
   state = Scroll_State.Scroll_to_Open; 
  } else { 
   state = Scroll_State.Scroll_to_Close; 
  } 
  } else {// 菜單打開時(shí) 
  // 當(dāng)按下時(shí)的觸摸點(diǎn)在menu區(qū)域時(shí),只有向左滑動(dòng)超過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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

铜川市| 潍坊市| 抚远县| 浦江县| 长乐市| 灵武市| 金堂县| 辽宁省| 阿瓦提县| 奎屯市| 织金县| 桂林市| 新建县| 平谷区| 龙井市| 黄龙县| 喀喇沁旗| 隆回县| 宁强县| 三门县| 郴州市| 新竹县| 大城县| 桑植县| 津市市| 拉萨市| 拉孜县| 杭锦旗| 达拉特旗| 靖江市| 讷河市| 勃利县| 建昌县| 三河市| 佳木斯市| 丽江市| 油尖旺区| 开原市| 黔东| 巍山| 镇雄县|