热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android仿人人网滑动侧边栏效果

这篇文章主要为大家详细介绍了Android仿人人网滑动侧边栏效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

很多应用为了节省空间而又使界面能够充足的显示信息,大多数应用都采用了侧边栏的方式,如下图: 

     

来说说它的思路,底下是两个或多个视图,分别通过控制它们的宽度、左边距来控制它们的显示,来看看代码 

activity_main.xml



  
  

  
  



 MainActivity.java

 

public class MainActivity extends Activity implements OnTouchListener
{

  private LinearLayout menu;
  private LinearLayout content;
  private LayoutParams menuParams;
  private LayoutParams contentParams;

  // menu完全显示时,留给content的宽度值。
  private static final int menuPadding = 80;

  // 分辨率
  private int disPlayWidth;

  private float xDown;
  private float xMove;

  private boolean mIsShow = false;
  private static final int speed = 50;

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

    disPlayWidth = getWindowManager().getDefaultDisplay().getWidth();

    menu = (LinearLayout) findViewById(R.id.menu);
    cOntent= (LinearLayout) findViewById(R.id.content);
    menuParams = (LayoutParams) menu.getLayoutParams();
    cOntentParams= (LayoutParams) content.getLayoutParams();
    findViewById(R.id.layout).setOnTouchListener(this);

    menuParams.width = disPlayWidth - menuPadding;
    contentParams.width = disPlayWidth;
    showMenu(mIsShow);
  }

  @Override
  public boolean onTouch(View v, MotionEvent event)
  {
    switch (event.getAction())
    {
    case MotionEvent.ACTION_DOWN:
      showMenu(!mIsShow);
      break;
    case MotionEvent.ACTION_MOVE:
      break;
    case MotionEvent.ACTION_UP:
      break;
    }
    return true;
  }

  private void showMenu(boolean isShow)
  {
    if (isShow)
    {
      mIsShow = true;
      menuParams.leftMargin = 0;
    } else
    {
      mIsShow = false;
      menuParams.leftMargin = 0 - menuParams.width;
    }
    menu.setLayoutParams(menuParams);
  }
  }

    上述代码只是用两张图片代替了两个复杂的view(layout),你会发现,两个视图虽然可以切换,但没有动画的感觉,再加上要有拖动效果,所以,我们再给它加个平移时间段,看起来有动画的效果 

 package com.example.test;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

public class MainActivity extends Activity implements OnTouchListener, OnClickListener
{

  private LinearLayout menu;
  private LinearLayout content;
  private LayoutParams menuParams;
  private LayoutParams contentParams;

  // menu完全显示时,留给content的宽度值。
  private static final int menuPadding = 80;

  // 分辨率
  private int disPlayWidth;

  private float xDown;
  private float xMove;

  private boolean mIsShow = false;
  private static final int speed = 50;

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

    disPlayWidth = getWindowManager().getDefaultDisplay().getWidth();

    menu = (LinearLayout) findViewById(R.id.menu);
    menu.setOnClickListener(this);
    cOntent= (LinearLayout) findViewById(R.id.content);
    content.setOnClickListener(this);
    menuParams = (LayoutParams) menu.getLayoutParams();
    cOntentParams= (LayoutParams) content.getLayoutParams();
    //findViewById(R.id.layout).setOnTouchListener(this);

    menuParams.width = disPlayWidth - menuPadding;
    contentParams.width = disPlayWidth;
    showMenu(mIsShow);
  }

  @Override
  public void onClick(View v)
  {
    switch (v.getId())
    {
    case R.id.menu:
      new showMenuAsyncTask().execute(-50);
      break;
    case R.id.content:
      new showMenuAsyncTask().execute(50);
      break;
    }

  }

  @Override
  public boolean onTouch(View v, MotionEvent event)
  {
    switch (event.getAction())
    {
    case MotionEvent.ACTION_DOWN:
      showMenu(!mIsShow);
      break;
    case MotionEvent.ACTION_MOVE:
      break;
    case MotionEvent.ACTION_UP:
      break;
    }
    return true;
  }

  private void showMenu(boolean isShow)
  {
    if (isShow)
    {
      mIsShow = true;
      menuParams.leftMargin = 0;
    } else
    {
      mIsShow = false;
      menuParams.leftMargin = 0 - menuParams.width;
    }
    menu.setLayoutParams(menuParams);
  }

  /**
  *
  *这是主要代码:模拟动画过程,也让我更熟悉了AsyncTask这玩意儿
  *
  */
  class showMenuAsyncTask extends AsyncTask
  {

    @Override
    protected Integer doInBackground(Integer... params)
    {
      int leftMargin = menuParams.leftMargin;
      
      //这里也是值得学习的地方,如果在平常,自己肯定又是这样写:
      //  if(){
      //    while()
      // }
      //  else if(){
      //    while()
      // }
      while (true)
      {
        leftMargin += params[0];
        if (params[0] > 0 && leftMargin >= 0)
        {
          break;
        } else if (params[0] <0 && leftMargin <= -menuParams.width)
        {
          break;
        }
        publishProgress(leftMargin);
        try
        {
          Thread.sleep(30);
        } catch (InterruptedException e)
        {
          e.printStackTrace();
        }
      }
      return leftMargin;
    }

    @Override
    protected void onProgressUpdate(Integer... values)
    {
      super.onProgressUpdate(values);
      menuParams.leftMargin = values[0];
      menu.setLayoutParams(menuParams);
    }

    @Override
    protected void onPostExecute(Integer result)
    {
      super.onPostExecute(result);
      menuParams.leftMargin = result;
      menu.setLayoutParams(menuParams);
    }

  }

}

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


推荐阅读
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • 在Notepad++中配置Markdown语法高亮及实时预览功能
    本文详细介绍了如何在Notepad++中配置Markdown语法高亮和实时预览功能,包括必要的插件安装和设置步骤。 ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 本文介绍了通过ADB命令查询Android设备CPU的当前频率、最小频率和最大频率的方法。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • JavaScript 页面卸载事件详解 (onunload)
    当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
author-avatar
漂流小叶子2502896817
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有