之前一直使用SlidingDrawer抽屉效果,不过在整体布局中显示起来,总有点不舒服的感觉
现在终于有空了,用PopupWindow实现底部抽屉,让我们先看截图
好了,如果效果图不是各位想要的,就不用浪费时间看代码了
下面是项目的目录结构
整体文件也不多,3个布局文件、N个图片文件、其实一个Java类就可以,不过写的分开点,让大家看的清楚
我们先从布局文件看起:
activity_main.xml:
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/body_background" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/bottom_handler" /> </RelativeLayout>
activity_popup.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/content_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_handler" /> <GridView android:id="@+id/content_grid" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_background" android:columnWidth="90dp" android:gravity="center" android:horizontalSpacing="10dp" android:numColumns="auto_fit" android:paddingTop="5dp" android:stretchMode="columnWidth" android:verticalSpacing="20dp" /> </LinearLayout>
gridview_img_text.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/item_img" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/item_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textColor="#FFF" /> </LinearLayout>
/** * 使用PopupWindow实现抽屉效果 * @author Francis-ChinaFeng * @version 1.0 2014-02-17 */ public class MainActivity extends Activity { private Button button; private PopupWindow popupWindow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); setListener(); } private void init() { button = (Button) findViewById(R.id.button); } private void setListener() { button.setOnClickListener(new ButtonClickListener()); } private void showBottomMenu(View v) { View view = getLayoutInflater().inflate(R.layout.activity_popup, null); Button contentButton = (Button) view.findViewById(R.id.content_button); GridView contentGridView = (GridView) view.findViewById(R.id.content_grid); setGridViewNumColumns(contentGridView, 4); int[] items = { R.drawable.button_audio, R.drawable.button_camera, R.drawable.button_query, R.drawable.button_video }; String[] titles = { "录音", "拍照", "查询", "视频" }; final List<GridViewItem> data = new ArrayList<GridViewItem>(); for (int i = 0; i < items.length; i++) { GridViewItem entity = new GridViewItem(items[i], titles[i]); data.add(entity); } GridViewAdapter adapter = new GridViewAdapter(data, getLayoutInflater()); contentGridView.setAdapter(adapter); // boolean参数设置PopupWindow中的元素是否可以操作 popupWindow = new PopupWindow(view, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true); // 该设置解决PopupWindow各种不可思议Bug…… popupWindow.setBackgroundDrawable(new BitmapDrawable()); popupWindow.setOutsideTouchable(true); popupWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0); contentGridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View v, int position, long id) { GridViewItem entity = data.get(position); System.out.println(entity); Toast.makeText(MainActivity.this, entity.toString(), Toast.LENGTH_LONG).show(); } }); contentButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dismissBottomMenu(); } }); } private void dismissBottomMenu() { if (popupWindow != null && popupWindow.isShowing()) { popupWindow.dismiss(); popupWindow = null; } } // 点击其他区域,隐藏PopupWindow内容 @Override public boolean onTouchEvent(MotionEvent event) { dismissBottomMenu(); return super.onTouchEvent(event); } @Override protected void onDestroy() { dismissBottomMenu(); super.onDestroy(); } private class ButtonClickListener implements OnClickListener { @Override public void onClick(View v) { showBottomMenu(v); } } /** * 获取屏幕宽度 * @return */ public int getWidth() { WindowManager wManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wManager.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.widthPixels; } /** * 设置GridView中item的宽度 * @param v * @param numColumns */ public void setGridViewNumColumns(View v, int numColumns) { GridView view = (GridView) v; int columnWidth = getWidth() / ++numColumns; view.setColumnWidth(columnWidth); } }
/** * * @author Francis-ChinaFeng * @version 1.0 2014-2-17 */ public class GridViewItem { private int item_img; private String item_text; public GridViewItem(int item_img, String item_text) { super(); this.item_img = item_img; this.item_text = item_text; } @Override public String toString() { return "GridViewItem [item_img=" + item_img + ", item_text=" + item_text + "]"; } public int getItem_img() { return item_img; } public void setItem_img(int item_img) { this.item_img = item_img; } public String getItem_text() { return item_text; } public void setItem_text(String item_text) { this.item_text = item_text; } }
/** * * @author Francis-ChinaFeng * @version 1.0 2014-2-17 */ public class GridViewAdapter extends BaseAdapter { private List<GridViewItem> data; private LayoutInflater inflater; public GridViewAdapter(List<GridViewItem> data, LayoutInflater inflater) { this.data = data; this.inflater = inflater; } @Override public int getCount() { return data != null ? data.size() : 0; } @Override public Object getItem(int position) { return data != null ? data.get(position) : null; } @Override public long getItemId(int position) { return data.size() > position && position > 0 ? position : 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { Holder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.gridview_img_text, null); holder = new Holder(); holder.item_img = (ImageView) convertView.findViewById(R.id.item_img); holder.item_text = (TextView) convertView.findViewById(R.id.item_text); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } holder.item_img.setBackgroundResource(data.get(position).getItem_img()); holder.item_text.setText(data.get(position).getItem_text()); return convertView; } private class Holder { private ImageView item_img; private TextView item_text; } }