【最讨厌那些不开源的】小米的米UI的BOTTOMVIEW源码完美反编译

来源:互联网 发布:国家大数据行动计划 编辑:程序博客网 时间:2024/04/30 11:49

其实原理就是WindowManager Dialog 和Animation的组合


这里分享一个Android的非常经典实用而且简单方便的第三方UI控件库:BottomView(小米的米UI也用到了这个)

实现功能:

可以在底部弹出的View里自定义布局;

可以自定义是否可以触摸外部消失;

可以自定义事件;

可以自定义外围背景是否透明;

可以自定义动画;

如果需要的话,可以强制为顶部View显示



用法:

1、下载BottomView.jar库文件,放到Android项目工程里的libs里

2、设置BottomView的Theme:

这2个Theme复制粘贴到你的项目的res/values/styles.xml里即可



  1. <!--半透明背景Theme-->
  2.    <style name="BottomViewTheme_Defalut">
  3.         <item name="android:windowFrame">@null</item>
  4.         <item name="android:windowContentOverlay">@null</item>
  5.         <item name="android:windowIsFloating">true</item>
  6.         <item name="android:windowIsTranslucent">false</item>
  7.         <item name="android:windowNoTitle">true</item>
  8.         <item name="android:windowBackground">@color/white</item>
  9.         <item name="android:backgroundDimEnabled">true</item>
  10.         <item name="android:windowFullscreen">true</item>
  11.     </style>
  12. <!--透明背景Theme-->
  13.     <style name="BottomViewTheme_Transparent">
  14.         <item name="android:windowFrame">@null</item>
  15.         <item name="android:windowIsFloating">true</item>
  16.         <!-- Transparent -->
  17.         <item name="android:windowIsTranslucent">false</item>
  18.         <item name="android:windowContentOverlay">@null</item>
  19.         <item name="android:windowNoTitle">true</item>
  20.         <item name="android:windowBackground">@color/white</item>
  21.         <item name="android:backgroundDimEnabled">false</item>
  22.     </style>
复制代码

另外如果提示
  1. <item name="android:windowBackground">@color/white</item>
复制代码

这里的white找不到的话,说明你项目res/values/color.xml没有新建或者没有white颜色这个值,只需在res/values/color.xml里添加
  1.      <color name="white">#ffffff</color>
复制代码

这个白色值即可。

另外View的动画Theme可选,建议也复制进去,效果好一些,代码如下:

  1. <font color="#333333"><font face="Arial"> <style name="BottomToTopAnim" parent="android:Animation">
  2.         <item name="@android:windowEnterAnimation">@anim/bottomview_anim_enter</item>
  3.         <item name="@android:windowExitAnimation">@anim/bottomview_anim_exit</item>
  4.     </style></font></font>
复制代码
res/anim/bottomview_anim_enter.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >

  3.     <translate
  4.         android:duration="500"
  5.         android:fromYDelta="100%p" />

  6. </set>
复制代码

res/anim/bottomview_anim_exit.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >

  3.     <translate
  4.         android:duration="500"
  5.         android:toYDelta="100%p" />

  6. </set>
复制代码



整体为:



2、部分核心使用代码:


  1. BottomView bottomView = new BottomView(this,
  2.                                         R.style.BottomViewTheme_Defalut, R.layout.bottom_view);
  3.                         bottomView.setAnimation(R.style.BottomToTopAnim);//设置动画,可选
  4.                         bottomView.showBottomView(false);
复制代码



如果想获取这个View的话,调用.getView()方法即可。

效果图之一:(可随意发挥)



以下是源代码“:

package com.tandong.bottomview;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;import com.tandong.bottomview.adapter.BVAdapter;import com.tandong.bottomview.view.BottomView;/** * BottomView *  * www.aplesson.com *  * @author TanDong *  */public class MainActivity extends Activity implements OnClickListener {private Button btn_show;private ListView lv_menu_list;private ArrayList<String> menus;private BottomView bottomView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}private void initData() {menus = new ArrayList<String>();menus.add(getResources().getString(R.string.menu_search));menus.add(getResources().getString(R.string.menu_filemanage));menus.add(getResources().getString(R.string.menu_downloadmanage));menus.add(getResources().getString(R.string.menu_setting));menus.add(getResources().getString(R.string.menu_about));}private void initView() {btn_show = (Button) this.findViewById(R.id.btn_show);btn_show.setOnClickListener(this);}@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.btn_show:bottomView = new BottomView(MainActivity.this,R.style.BottomViewTheme_Defalut, R.layout.bottom_view);bottomView.setAnimation(R.style.BottomToTopAnim);bottomView.showBottomView(false);lv_menu_list = (ListView) bottomView.getView().findViewById(R.id.lv_list);BVAdapter adapter = new BVAdapter(MainActivity.this, menus);lv_menu_list.setAdapter(adapter);lv_menu_list.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) {bottomView.dismissBottomView();}});break;default:break;}}}

package com.tandong.bottomview.adapter;import java.util.ArrayList;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import com.tandong.bottomview.R;/** * BottomView *  * @author TanDong *  */public class BVAdapter extends BaseAdapter {private Context c;private ArrayList<String> alss;public BVAdapter(Context context, ArrayList<String> als) {this.c = context;this.alss = als;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn alss.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn alss.get(arg0);}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn arg0;}@Overridepublic View getView(int position, View convertView, ViewGroup arg2) {convertView = View.inflate(c, R.layout.item, null);TextView tv = (TextView) convertView.findViewById(R.id.tv_name);tv.setText(alss.get(position));return convertView;}}



原理:


package com.tandong.bottomview.view;import android.app.Dialog;import android.content.Context;import android.view.Display;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.view.WindowManager.LayoutParams;public class BottomView{  private View convertView;  private Context context;  private int theme;  private Dialog bv;  private int animationStyle;  private boolean isTop = false;  public BottomView(Context c, int theme, View convertView)  {    this.theme = theme;    this.context = c;    this.convertView = convertView;  }  public BottomView(Context c, int theme, int resource) {    this.theme = theme;    this.context = c;    this.convertView = View.inflate(c, resource, null);  }  public void showBottomView(boolean CanceledOnTouchOutside) {    if (this.theme == 0)      this.bv = new Dialog(this.context);    else      this.bv = new Dialog(this.context, this.theme);    this.bv.setCanceledOnTouchOutside(CanceledOnTouchOutside);    this.bv.getWindow().requestFeature(1);    this.bv.setContentView(this.convertView);    Window wm = this.bv.getWindow();    WindowManager m = wm.getWindowManager();    Display d = m.getDefaultDisplay();    WindowManager.LayoutParams p = wm.getAttributes();    p.width = (d.getWidth() * 1);    if (this.isTop)      p.gravity = 48;    else      p.gravity = 80;    if (this.animationStyle != 0)    {      wm.setWindowAnimations(this.animationStyle);    }    wm.setAttributes(p);    this.bv.show();  }  public void setTopIfNecessary() {    this.isTop = true;  }  public void setAnimation(int animationStyle) {    this.animationStyle = animationStyle;  }  public View getView() {    return this.convertView;  }  public void dismissBottomView() {    if (this.bv != null)      this.bv.dismiss();  }}



0 0
原创粉丝点击