注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

尐鬼じ☆ve伱

和你在一起的日子

 
 
 

日志

 
 

android:同时弹出顶部和底部菜单的做法 (转)  

2013-03-08 14:46:42|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://www.cnblogs.com/carmanloneliness/archive/2012/08/13/2636484.html

在android开发中会碰到这样的需求,要同时弹出顶部和底部的菜单。目前已经上市的APP中有91熊猫读书和QQ阅读器带这样的功能。

点击Menu和点击屏幕都会弹出菜单。有很多方法可以实现。我的方法是在RelativaLayout中设置好菜单布局,然后在监听事件中使其

显示/隐藏。具体做法如下:

  一:布局。可根据需求做一些复杂的设计。在这儿用两个按钮btn_top和btn_bottom。

<Button
  android:id="@+id/btn_top"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="#AAAAAA"
  android:text="@string/top" android:textSize="30dip"
  android:textColor="#FF0000"
  android:visibility="invisible" /> <!-- 默认隐藏-->
<Button
  android:id="@+id/btn_bottom"
  android:layout_height="wrap_content" android:layout_width="fill_parent"
  android:background="#AAAAAA"
  android:text="@string/bottom" android:textSize="30dip"
  android:textColor="#FF0000"
  android:layout_alignParentBottom="true"
  android:visibility="invisible" /> <!-- 默认隐藏-->

//这两个视图放在最上一层。在同一个layout设置需要的主布局。

  二:在代码中设置handler.因为主线程不能操作UI,只能通过handler实现

private class MainHandler extends Handler{
  static final int MSG_VISIBLE = 1; //显示
  static final int MSG_INVISIBLE = 2; //消失
  @Override
  public void handleMessage(Message msg) {
  super.handleMessage(msg);
  Animation inAnima = new AlphaAnimation(0.1f, 1.0f); //代表按钮显示时的动画效果。可根据需求来设置
  inAnima.setDuration(1000);
  Animation outAnima = new AlphaAnimation(1.0f, 0.1f);//代表按钮消失时的动画效果。可根据需求来设置
  outAnima.setDuration(1000);
  switch(msg.what)
  {
    case MSG_VISIBLE:
      btnTop.setAnimation(inAnima);//设置显示时动画
      btnBottom.setAnimation(inAnima);//设置显示时动画
      btnTop.setVisibility(View.VISIBLE);//设置显示
      btnBottom.setVisibility(View.VISIBLE);//设置显示
      break;
    case MSG_INVISIBLE:
      btnTop.setAnimation(outAnima);//设置消失时动画
      btnBottom.setAnimation(outAnima);//设置消失时动画
      btnTop.setVisibility(View.INVISIBLE);//设置消失
      btnBottom.setVisibility(View.INVISIBLE);//设置消失
      break;
    default:
      break;
  }
  }

  public void sendMessage(int nMsg) { //在Handler中封装下sendMessage函数,提高代码简洁性
    Message msg = Message.obtain();
    msg.what = nMsg;
    this.sendMessage(msg);
  }
}

三.onCreate函数,onCreate函数尽量简洁,能封装出去的就封装出去,然后调用就可以了。设置一个变量

clickCount来代表该显示还是该隐藏视图。

private int clickCount = 0; //奇数显示,偶数隐藏 

  @Override
  protected void onCreate(Bundle savedInstanceState) { //建议主函数像左边这样
    super.onCreate(savedInstanceState);
    setContentView(R.layout.testintentactivity);
    btnTop = (Button)this.findViewById(R.id.btn_top);
    btnBottom = (Button)this.findViewById(R.id.btn_bottom);
    handler = new MainHandler(); //定义handler
    setListener();
    }

    private void setListener() {
      btnTop.setOnClickListener(this);
      btnBottom.setOnClickListener(this);
    }

  @Override
  public void onClick(View v) {
    clickCount ++; //全局变量值要变
    switch (v.getId()) {
    case R.id.btn_top:
      Toast.makeText(this, getResources().getString(R.string.top),Toast.LENGTH_SHORT).show(); //弹出Toast来测试按钮是否获取到了焦点
      break;
    case R.id.btn_bottom:
      Toast.makeText(this, getResources().getString(R.string.bottom),Toast.LENGTH_SHORT).show();//弹出Toast来测试按钮是否获取到了焦点
      break;
    default:
      break;
    }
    handler.sendMessage(MainHandler.MSG_INVISIBLE);//不管点击哪个按钮。两按钮都要设置隐藏。
  }

四.通过onTouchEvent来监听屏幕的点击,并且通过onKeyDown监听Menu键

@Override
  public boolean onTouchEvent(MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_UP){
    clickCount++;
    if(clickCount % 2 == 0){ //偶数隐藏
    handler.sendMessage(MainHandler.MSG_INVISIBLE);
    }else{ //奇数消失
    handler.sendMessage(MainHandler.MSG_VISIBLE);
    }
  }
  return true;
}

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_MENU){ //不要通过onCreateOptionsMenu来监听Menu.它会调用系统的一些默认属性,达不到我们想要的效果
    clickCount++;
    if(clickCount % 2 == 0){
    handler.sendMessage(MainHandler.MSG_INVISIBLE);
    }else{
    handler.sendMessage(MainHandler.MSG_VISIBLE);
    }
    }
    return super.onKeyDown(keyCode, event);
  }



  评论这张
 
阅读(391)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017