731
京東網上商城
【最討厭那些不開源的】小米的米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裏即可
- <!--半透明背景Theme-->
- <style name="BottomViewTheme_Defalut">
- <item name="android:windowFrame">@null</item>
- <item name="android:windowContentOverlay">@null</item>
- <item name="android:windowIsFloating">true</item>
- <item name="android:windowIsTranslucent">false</item>
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowBackground">@color/white</item>
- <item name="android:backgroundDimEnabled">true</item>
- <item name="android:windowFullscreen">true</item>
- </style>
- <!--透明背景Theme-->
- <style name="BottomViewTheme_Transparent">
- <item name="android:windowFrame">@null</item>
- <item name="android:windowIsFloating">true</item>
- <!-- Transparent -->
- <item name="android:windowIsTranslucent">false</item>
- <item name="android:windowContentOverlay">@null</item>
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowBackground">@color/white</item>
- <item name="android:backgroundDimEnabled">false</item>
- </style>
另外如果提示
- <item name="android:windowBackground">@color/white</item>
這裏的white找不到的話,說明你項目res/values/color.xml沒有新建或者沒有white顏色這個值,隻需在res/values/color.xml裏添加
- <color name="white">#ffffff</color>
這個白色值即可。
另外View的動畫Theme可選,建議也複製進去,效果好一些,代碼如下:
- <font color="#333333"><font face="Arial"> <style name="BottomToTopAnim" parent="android:Animation">
- <item name="@android:windowEnterAnimation">@anim/bottomview_anim_enter</item>
- <item name="@android:windowExitAnimation">@anim/bottomview_anim_exit</item>
- </style></font></font>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:andro >
- <translate
- android:duration="500"
- android:fromYDelta="100%p" />
- </set>
res/anim/bottomview_anim_exit.xml
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:andro >
- <translate
- android:duration="500"
- android:toYDelta="100%p" />
- </set>
整體為:
2、部分核心使用代碼:
- BottomView bottomView = new BottomView(this,
- R.style.BottomViewTheme_Defalut, R.layout.bottom_view);
- bottomView.setAnimation(R.style.BottomToTopAnim);//設置動畫,可選
- 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(); } }
最後更新:2017-04-03 06:03:03