【最討厭那些不開源的】小米的米UI的BOTTOMVIEW源碼完美反編譯

來源:互聯網
上載者:User

其實原理就是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();  }}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.