Android实现网易新闻客户端侧滑菜单(2)

Android实现网易新闻客户端侧滑菜单(2),第1张

概述前面已经讲过通过三方开源库SlideMenu来实现这种效果,请参考Android实现网易新闻客户端侧滑菜单(一)

前面已经讲过通过三方开源库SlIDeMenu来实现这种效果,请参考Android实现网易新闻客户端侧滑菜单(一)

今天通过自定义view来实现这种功能。

代码如下:

SlIDeMenu.java

package com.jackIE.slIDemenu.vIEw;  import androID.content.Context; import androID.graphics.Canvas; import androID.util.AttributeSet; import androID.vIEw.MotionEvent; import androID.vIEw.VIEw; import androID.vIEw.VIEwConfiguration; import androID.vIEw.VIEwGroup; import androID.Widget.Scroller;  public class SlIDeMenu extends VIEwGroup {   private int mMostRecentX;  // 最后一次x轴的偏移量    private final int MENU_SCREEN = 0;  // 菜单界面  private final int MAIN_SCREEN = 1;  // 主界面  private int mCurrentScreen = MAIN_SCREEN;  // 当前屏幕显示的是主界面  private Scroller mScroller;   private int touchSlop;   public SlIDeMenu(Context context,AttributeSet attrs) {   super(context,attrs);   mScroller = new Scroller(context);      touchSlop = VIEwConfiguration.get(context).getScaledtouchSlop();  }   /**   * 测量出所有子布局的宽和高   */  @OverrIDe  protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {   super.onMeasure(wIDthMeasureSpec,heightmeasureSpec);      measureVIEw(wIDthMeasureSpec,heightmeasureSpec);  }    /**   * 测量所有子布局的宽和高   * @param wIDthMeasureSpec 父布局也就是VIEwGroup的宽度测量规格   * @param heightmeasureSpec 父布局也就是VIEwGroup的高度测量规格   */  private voID measureVIEw(int wIDthMeasureSpec,int heightmeasureSpec) {   // 测量菜单的宽和高   VIEw menuVIEw = getChildAt(0);   menuVIEw.measure(menuVIEw.getLayoutParams().wIDth,heightmeasureSpec);      // 测量主界面的宽和高   VIEw mainVIEw = getChildAt(1);   mainVIEw.measure(wIDthMeasureSpec,heightmeasureSpec);  // 主界面的宽和高和父控件vIEwgroup的宽高一样  }   @OverrIDe  protected voID onLayout(boolean changed,int l,int t,int r,int b) {   // 布置菜单的位置   VIEw menuVIEw = getChildAt(0);   menuVIEw.layout(-menuVIEw.getMeasureDWIDth(),b);      // 布置主界面的位置   VIEw mainVIEw = getChildAt(1);   mainVIEw.layout(0,r,b);  }   @OverrIDe  public boolean ontouchEvent(MotionEvent event) {   switch (event.getAction()) {   case MotionEvent.ACTION_DOWN:    mMostRecentX = (int) event.getX();    break;   case MotionEvent.ACTION_MOVE:    // 最新的x轴偏移量    int moveX = (int) event.getX();        // 增量值    int deltaX = mMostRecentX - moveX;        // 把最新的x轴偏移量赋值给成员变量    mMostRecentX = moveX;        // 得到x轴移动后的偏移量    int newScrollX = getScrollX() + deltaX;        if(newScrollX < -getChildAt(0).getWIDth()) {  // 当前屏幕x轴的偏移量超过了菜单的左边界     // 回到菜单的左边界位置     scrollTo(-getChildAt(0).getWIDth(),0);    } else if(newScrollX > 0) {  // 超过了主界面的右边界     // 回到主界面的右边界     scrollTo(0,0);    } else {     scrollBy(deltaX,0);    }    break;   case MotionEvent.ACTION_UP:    int scrollX = getScrollX();  // x轴最新的偏移量        int menuXCenter = -getChildAt(0).getWIDth() / 2;  // 菜单x轴的中心点        if(scrollX > menuXCenter) { // 切换到主界面     mCurrentScreen = MAIN_SCREEN;    } else { // 切换到菜单界面     mCurrentScreen = MENU_SCREEN;    }    switchScreen();    break;   default:    break;   }   return true;  }   /**   * 根据mCurrentScreen切换屏幕   */  private voID switchScreen() {   int scrollX = getScrollX(); // 当前x轴的偏移量   int dx = 0;      if(mCurrentScreen == MAIN_SCREEN) { // 切换到主界面 //   scrollTo(0,0);    dx = 0 - scrollX;   } else if(mCurrentScreen == MENU_SCREEN) { // 切换到菜单界面 //   scrollTo(-getChildAt(0).getWIDth(),0);    dx = -getChildAt(0).getWIDth() - scrollX;   }      mScroller.startScroll(scrollX,dx,Math.abs(dx) * 5);      invalIDate();  // invalIDate -> drawChild -> child.draw -> computeScroll  }   /**   * invalIDate出发此方法,更新屏幕的x轴的偏移量   */  @OverrIDe  public voID computeScroll() {   if(mScroller.computeScrollOffset()) {  // 判断是否正在模拟数据中,true 正在进行 false 数据模拟完毕    scrollTo(mScroller.getCurrX(),0);        invalIDate();  // 引起computeScroll的调用   }  }   /**   * 是否显示菜单   * @return   */  public boolean isShowMenu() {   return mCurrentScreen == MENU_SCREEN;  }    /**   * 隐藏菜单   */  public voID hIDeMenu() {   mCurrentScreen = MAIN_SCREEN;   switchScreen();  }    /**   * 显示菜单   */  public voID showMenu() {   mCurrentScreen = MENU_SCREEN;   switchScreen();  }   /**   * 拦截事件的方法   */  @OverrIDe  public boolean onIntercepttouchEvent(MotionEvent ev) {   switch (ev.getAction()) {   case MotionEvent.ACTION_DOWN:    mMostRecentX = (int) ev.getX();    break;   case MotionEvent.ACTION_MOVE:        int diffX = (int) (ev.getX() - mMostRecentX);    if(Math.abs(diffX) > touchSlop) {     return true;    }    break;   default:    break;   }   return super.onIntercepttouchEvent(ev);  }   } 

MainActivity.java

package com.jackIE.slIDemenu;  import com.jackIE.slIDemenu.vIEw.SlIDeMenu;  import androID.os.Bundle; import androID.app.Activity; import androID.vIEw.Menu; import androID.vIEw.VIEw; import androID.vIEw.VIEw.OnClickListener; import androID.vIEw.Window; import androID.Widget.TextVIEw; import androID.Widget.Toast;  public class MainActivity extends Activity implements OnClickListener {   private SlIDeMenu mSlIDeMenu;   @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   // 去除标题,需要在setContentVIEw之前调用   requestwindowFeature(Window.FEATURE_NO_Title);   setContentVIEw(R.layout.activity_main);         mSlIDeMenu = (SlIDeMenu) findVIEwByID(R.ID.slIDemenu);   findVIEwByID(R.ID.iv_slIDemenu_main_back).setonClickListener(this);        }   @OverrIDe  public boolean onCreateOptionsMenu(Menu menu) {   // Inflate the menu; this adds items to the action bar if it is present.   getMenuInflater().inflate(R.menu.main,menu);   return true;  }   @OverrIDe  public voID onClick(VIEw v) {   if(mSlIDeMenu.isShowMenu()) {    mSlIDeMenu.hIDeMenu();   } else {    mSlIDeMenu.showMenu();   }  }   public voID click(VIEw v) {   TextVIEw tv = (TextVIEw) v;   Toast.makeText(this,tv.getText(),0).show();  } }

系列文章:

Android实现网易新闻客户端效果

Android实现网易新闻客户端侧滑菜单(1)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android实现网易新闻客户端侧滑菜单(2)全部内容,希望文章能够帮你解决Android实现网易新闻客户端侧滑菜单(2)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147759.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存