栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

  }

}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/161269.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号