博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AndroidUI开源组件库BottomView 第三方自定义UI控件
阅读量:5009 次
发布时间:2019-06-12

本文共 7566 字,大约阅读时间需要 25 分钟。

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

原文  

实现功能:

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

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

可以自定义事件;

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

可以自定义动画;

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

BottomView.jar库文件下载地址:http://download.csdn.net/detail/jay100500/7547055

BottomView的Demo下载地址:http://download.csdn.net/detail/jay100500/7547049

 

其实原理就是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
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
(); 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
alss; public BVAdapter(Context context, ArrayList
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(); } } 

转载于:https://www.cnblogs.com/exmyth/p/4579227.html

你可能感兴趣的文章
php 现在拓展地址
查看>>
【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)...
查看>>
团队个人冲刺第三天
查看>>
unit
查看>>
2017-10-17 NOIP模拟赛2
查看>>
How to install ia32-libs in Ubuntu 14.04 LTS (Trusty Tahr)
查看>>
ACM/ICPC 之 模拟 (HNUOJ 13391-换瓶模拟)
查看>>
JavaWeb学习——JSP基础
查看>>
Eclipse tomcat server 无法添加项目
查看>>
黑寡妇黄飞鸿
查看>>
leetcode 217 Contains Duplicate 数组中是否有重复的数字
查看>>
The Ctrl & CapsLock `problem'
查看>>
MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
查看>>
linux故障判断
查看>>
Leetcode 23. Merge k Sorted Lists(python)
查看>>
Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
查看>>
Makefile ===> Makefile 快速学习
查看>>
face detection[HR]
查看>>
java性能调优工具
查看>>
C# 其他的Url 文件的路径转化为二进制流
查看>>