android Drawer Arrow Drawable(meun-icon-to-back-arrow)使用,仿知乎菜单栏界面

来源:互联网 发布:openstack网络架构图 编辑:程序博客网 时间:2024/05/24 22:42
http://blog.csdn.net/itwuchen/article/details/45419219(转)

Drawer Arrow Drawable(meun-icon-to-back-arrow)使用,仿知乎菜单栏界面

一、什么是Drawer Arrow Drawable

Drawer Arrow Drawable 其实就是一个抽屉侧滑菜单栏,只不过加入了很酷炫的meun-icon-to-back-arrow动画效果,如下图所示



二、Drawer Arrow Drawable的实现原理

设计方法:

我的想法是:如果我能生成每条线末端的移动曲线,我就能随抽屉(drawer)的滑动,根据参数t简单地计算出每条路径(path)上的点,
然后只需从curveA上的点M向curveB上的N绘制一条直线即可。

为了生成这些曲线,我需要一个适合取用的点的集合案例。我首先想到我应该在打开抽屉的时候,从我的设备上录制视频,分成N帧。但是我突然
想到:抽屉滑动时的插值器会使得这些帧不能均匀分布。不用太复杂,我只是粗略地移动抽屉,然后对每一步截屏。

 

这儿,我把所有的图像放在Adobe Illustrator上,并用一条向量追踪一条线(方便缩放:6pt等于6px),这是一个劳动密集型的过程,
充满了大量的错误;毕竟,六个像素加抗锯齿是一种低精度,相对于要使用到的数学方法


三、Drawer arrow Drawable的使用

[java] view plaincopyprint?
  1. package com.example.ldrawertest;  
  2.   
  3. import com.example.ldrawerlibrary.ActionBarDrawerToggle;  
  4. import com.example.ldrawerlibrary.DrawerArrowDrawable;  
  5. import android.annotation.SuppressLint;  
  6. import android.app.ActionBar;  
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9. import android.content.res.Configuration;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.support.v4.widget.DrawerLayout;  
  13. import android.view.MenuItem;  
  14. import android.view.View;  
  15. import android.widget.AdapterView;  
  16. import android.widget.ArrayAdapter;  
  17. import android.widget.ListView;  
  18.   
  19.   
  20. public class MainActivity extends Activity {  
  21.   
  22.     private DrawerLayout mDrawerLayout;  
  23.     private ListView mDrawerList;  
  24.     private ActionBarDrawerToggle mDrawerToggle;  
  25.     private DrawerArrowDrawable drawerArrow;  
  26.     private boolean drawerArrowColor;  
  27.   
  28.     @SuppressLint("NewApi")  
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.           
  34.         //得到一个actionbar  
  35.         ActionBar ab = getActionBar();  
  36.         // 给左上角图标的左边加上一个返回的图标  
  37.         ab.setDisplayHomeAsUpEnabled(true);  
  38.         //必须通过调用setHomeButtonEnabled(true)方法确保这个图标能够作为一个操作项  
  39.         ab.setHomeButtonEnabled(true);  
  40.   
  41.           
  42.         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);  
  43.        //抽屉侧栏的布局,为一个listView  
  44.         mDrawerList = (ListView) findViewById(R.id.navdrawer);  
  45.   
  46.         //创建DrawerArrow  
  47.         drawerArrow = new DrawerArrowDrawable(this) {  
  48.             @Override  
  49.             public boolean isLayoutRtl() {  
  50.                 return false;  
  51.             }  
  52.         };  
  53.           
  54.         /* 
  55.          *  ActionBarDrawerToggle  是 DrawerLayout.DrawerListener实现。 
  56.             和 NavigationDrawer 搭配使用,推荐用这个方法,符合Android design规范。 
  57.             作用: 
  58.             1.改变android.R.id.home返回图标。 
  59.             2.Drawer拉出、隐藏,带有android.R.id.home动画效果。 
  60.             3.监听Drawer拉出、隐藏; 
  61.          */  
  62.           
  63.           
  64.         //动作条抽屉切换器将抽屉与app icon动作条绑定正确交互。  
  65.         mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,  
  66.             drawerArrow, R.string.drawer_open,  
  67.             R.string.drawer_close) {  
  68.             //当抽屉关闭时  
  69.             public void onDrawerClosed(View view) {  
  70.                 super.onDrawerClosed(view);  
  71.                 /* 
  72.                  * getActivity().invalidateOptionsMenu();  
  73.                  * 在运行时改变menu item的状态。你需要重写onPrepareOptionsMenu() , 
  74.                  * 它方便你对item移除,添加,使不可用等。在android 3.0以上, 
  75.                  * 你必须调用invalidateOptionsMenu() 。 
  76.                  *  
  77.                  */  
  78.                 invalidateOptionsMenu();  
  79.             }  
  80.             //当抽屉打开时  
  81.             public void onDrawerOpened(View drawerView) {  
  82.                 super.onDrawerOpened(drawerView);  
  83.                 invalidateOptionsMenu();  
  84.             }  
  85.         };  
  86.           
  87.         //设置监听drawer切换  
  88.         mDrawerLayout.setDrawerListener(mDrawerToggle);  
  89.         //该方法会自动和actionBar关联, 将开关的图片显示在了action上,如果不设置,也可以有抽屉的效果,不过是默认的图标    
  90.         mDrawerToggle.syncState();  
  91.   
  92.         //设置LDrawer填充内容,通过Adapter填充  
  93.         String[] values = new String[]{  
  94.             "     用户名",  
  95.             "     发现",  
  96.             "     关注",  
  97.             "     收藏",  
  98.             "     草稿",  
  99.             "     提问",  
  100.             "     设置"  
  101.         };  
  102.           
  103.         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  
  104.             android.R.layout.simple_list_item_1, android.R.id.text1, values);  
  105.         mDrawerList.setAdapter(adapter);  
  106.           
  107.           
  108.         //抽屉侧栏设置点击事件  
  109.         mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  110.             @Override  
  111.             public void onItemClick(AdapterView<?> parent, View view,  
  112.                                     int position, long id) {  
  113.                 switch (position) {  
  114.                     case 0:  
  115.                         mDrawerToggle.setAnimateEnabled(false);//设置停止或开启动画  
  116.                         drawerArrow.setProgress(1f);//设置普通菜单图标模式  
  117.                         break;  
  118.                     case 1:  
  119.                         mDrawerToggle.setAnimateEnabled(false);  
  120.                         drawerArrow.setProgress(0f);//设置返回箭头模式  
  121.                         break;  
  122.                     case 2:  
  123.                         mDrawerToggle.setAnimateEnabled(true);  
  124.                         mDrawerToggle.syncState();  
  125.                         break;  
  126.                     case 3:  
  127.                         if (drawerArrowColor) {  
  128.                             drawerArrowColor = false;  
  129. //                            drawerArrow.setColor(R.color.ldrawer_color);//设置颜色  
  130.                         } else {  
  131.                             drawerArrowColor = true;  
  132. //                            drawerArrow.setColor(R.color.drawer_arrow_second_color);  
  133.                         }  
  134.                         mDrawerToggle.syncState();  
  135.                         break;  
  136.                     case 4:  
  137.                         Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/IkiMuhendis/LDrawer"));  
  138.                         startActivity(browserIntent);  
  139.                         break;  
  140.                     case 5:  
  141.                         Intent share = new Intent(Intent.ACTION_SEND);  
  142.                         share.setType("text/plain");  
  143.                         share.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  144.                         share.putExtra(Intent.EXTRA_SUBJECT,  
  145.                             getString(R.string.app_name));  
  146.                         share.putExtra(Intent.EXTRA_TEXT, getString(R.string.app_description) + "\n" +  
  147.                             "GitHub Page :  https://github.com/IkiMuhendis/LDrawer\n" +  
  148.                             "Sample App : https://play.google.com/store/apps/details?id=" +  
  149.                             getPackageName());  
  150.                         startActivity(Intent.createChooser(share,  
  151.                             getString(R.string.app_name)));  
  152.                         break;  
  153.                     case 6:  
  154.                         String appUrl = "https://play.google.com/store/apps/details?id=" + getPackageName();  
  155.                         Intent rateIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appUrl));  
  156.                         startActivity(rateIntent);  
  157.                         break;  
  158.                 }  
  159.   
  160.             }  
  161.         });  
  162.     }  
  163.   
  164.       
  165.       
  166.     //菜单键点的事件处理  
  167.     @Override  
  168.     public boolean onOptionsItemSelected(MenuItem item) {  
  169.         if (item.getItemId() == android.R.id.home) {  
  170.             if (mDrawerLayout.isDrawerOpen(mDrawerList)) {  
  171.                 mDrawerLayout.closeDrawer(mDrawerList);  
  172.             } else {  
  173.                 mDrawerLayout.openDrawer(mDrawerList);  
  174.             }  
  175.         }  
  176.         return super.onOptionsItemSelected(item);  
  177.     }  
  178.   
  179.     //activity创完成后  
  180.     @Override  
  181.     protected void onPostCreate(Bundle savedInstanceState) {  
  182.         super.onPostCreate(savedInstanceState);  
  183.         mDrawerToggle.syncState();  
  184.     }  
  185.   
  186.     //配置改变时  
  187.     @Override  
  188.     public void onConfigurationChanged(Configuration newConfig) {  
  189.         super.onConfigurationChanged(newConfig);  
  190.         mDrawerToggle.onConfigurationChanged(newConfig);  
  191.     }  
  192. }  
0 0
原创粉丝点击