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

其实原理就是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;

	@Override
	protected 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);
	}

	@Override
	public 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() {
				@Override
				public 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;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return alss.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return alss.get(arg0);
	}

	@Override
	public long getItemId(int arg0) {
		// TODO Auto-generated method stub
		return arg0;
	}

	@Override
	public 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();
  }
}

【最讨厌那些不开源的】小米的米UI的BOTTOMVIEW源码完美反编译,布布扣,bubuko.com

时间: 2024-10-21 23:16:48

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

使用到的一些开源项目 一般根据名字都能搜出源码

版权声明:本文为博主原创文章,未经博主允许不得转载.

开源中国安卓客户端源码之自定义控件---ScreenShotView

首先,感谢开源中国的开源精神.当初学者拿到客户端源码时,可能会对其中的项目结构和代码产生许多困惑,不知道该从何下手,当然我也是其中一员,接触安卓时间不长,也不是很精通,但是通过一段时间的琢磨,慢慢地领会到其中的一些编程方法,我只是想把我弄明白的这些知识通过博客的形式记录下来,以备以后查看,当然也可以帮助到更多的初学者.我的主要工作是给代码添加注释,理顺调用关系,让初学者更快.更深刻地理解代码的含义,领会其精神.首先大家从http://git.oschina.net/oschina/android

[开源类库/项目] android保存崩溃时的错误信息log至本地【源码+jar包+使用说...

不知大家是否经常遇到这种情况:自己的项目有时会在没有连接到电脑时发生崩溃,好不容易发现的bug结果连接到电脑时又复现不出来了:又或者自己写的一个功能在开机启动时产生小bug导致崩溃,而刚启动的机器想让他打出log又不是那么容易.此时我们有必要将程序的崩溃信息写入本地的文件,方便我们做bug的修复.本项目为开源共同讨论的,奉上项目源码(有javadoc),以及打包好的jar包还有jar包的使用手册. 如果看官自行阅读源码,代码均有注释,应该简明易懂.如果看官想直接使用,请看下文的使用手册.推荐直接

【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

开源中国 OsChina Android 客户端源码分析(8)数据库Sqlite

1开源中国客户端使用的数据库部分的源码在net.oschina.app.db包下,两个类一个是用于管理数据库的创建类DatabaseHelper,继承SQLiteOpenHelper,另一个是用于数据库的增删改查的工具类NoteDatabase.那么数据库在开源中国源码中哪一模块用到了呢? 便签管理,便签是什么?就是一个记事本的功能o(^▽^)o 2关于SQLiteOpenHelper的使用,自己之前的项目中没有用到过,看了下,这里有个体会:当获取到SQLiteOpenHelper实例,并使用g

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载)

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载) 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1.概述:在web项目中,服务端和前端经常需要交互数据,有的时候由于网络相应慢,客户端在提交某些敏感数据(比如按照正常的业务逻辑,此份数据只能保存一份)时,如果前端多次点击提交按钮会导致提交多份数据,这种情况我们是要防止发生的. 2.解决方法: ①前端处理:在提交之后通过js立即将按钮

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载)

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载) 说明:Java开源生鲜电商中OMS订单系统中并发问题和锁机制的探讨与解决方案: 问题由来     假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A.B在不同的售票窗口均同时查询到了某车厢卧铺中.下铺位有空位.用户A正在犹豫订中铺还是下铺,这时用户B果断订购了下铺.当用户A决定订下铺时,系统提示下铺已经被预订,请重新选择铺位.在这个系统场景中,我们来探讨一下,火车票

如何高效地查看开源项目源码?

我们为什么要看源码? 这个小标题好像有点扯淡,不过我感觉还是有必要聊一聊. 最近搞 Blazor,手边常备 AspNetCore 源码,遇到问题了就翻源码. 然后有同样关注 Blazor 的同学会一起讨论一些问题,我知道的问题会直接分享,我不知道的问题,我就,甩一句,"看源码" 然后有的同学炸了,说,"不是每个人都可以像你一样看源码,源码不是每个人都能看的,不是每个人都想看源码" 当然原话不是这样,后两句是我添油加醋的,不过这两句想必是大部分同学的心声,心里害怕看源