其實原理就是WindowManager Dialog 和Animation的組合
這裡分享一個Android的非常經典實用而且簡單方便的第三方UI控制項陳列庫:BottomView(小米的米UI也用到了這個)
實現功能:
可以在底部彈出的View裡自訂布局;
可以自訂是否可以觸摸外部消失;
可以自訂事件;
可以自訂外圍背景是否透明;
可以自訂動畫;
如果需要的話,可以強製為頂部View顯示
用法:
1、下載BottomView.jar庫檔案,放到Android項目工程裡的libs裡
2、設定BottomView的Theme:
這2個Theme複製粘貼到你的項目的res/values/styles.xml裡即可
複製代碼
另外如果提示
複製代碼
這裡的white找不到的話,說明你項目res/values/color.xml沒有建立或者沒有white顏色這個值,只需在res/values/color.xml裡添加
複製代碼
這個白色值即可。
另外View的動畫Theme可選,建議也複製進去,效果好一些,代碼如下:
複製代碼res/anim/bottomview_anim_enter.xml
複製代碼
res/anim/bottomview_anim_exit.xml
複製代碼
整體為:
2、部分核心使用代碼:
複製代碼
如果想擷取這個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(); }}