android自定义PopupWindow组件
来源:互联网 发布:无网络怎么安装手写板 编辑:程序博客网 时间:2024/05/29 12:38
android自定义PopupWindow组件
在移动开发过程中,有时我们需要设置一个弹出框做为菜单,如微信中弹出框。为了达到这个效果,可以自定义PopupWindow组件来完成,笔者简单自定义了这个
组件。
先来看看效果图:
下面是代码部分:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragmentsyllabus_mainlayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/fragmentsyllabus_Topmain" android:layout_width="fill_parent" android:layout_height="45dip" android:background="@drawable/mmtitle_bg_alpha" android:orientation="horizontal" > <LinearLayout android:layout_width="100dp" android:layout_height="45dp" android:layout_weight="1" android:orientation="vertical" > <ImageView android:id="@+id/mainTop_SettingIR" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="right|center_vertical" android:layout_marginRight="30dp" android:clickable="true" android:src="@drawable/mainmenu_selector" /> </LinearLayout> </LinearLayout></LinearLayout>
example_popup.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/title_function_bg" android:orientation="vertical" > <ListView android:id="@+id/title_list" android:layout_width="160dp" android:layout_height="fill_parent" android:cacheColorHint="#123456" android:divider="@drawable/mm_title_functionframe_line" android:listSelector="@drawable/title_list_selector" android:padding="3dp" android:scrollingCache="false" /> </LinearLayout>
自定义PopWindow
package com.example.popupwindowtest;import java.util.ArrayList;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Rect;import android.graphics.drawable.ColorDrawable;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.PopupWindow;import android.widget.TextView;@SuppressLint("InflateParams")public class ExamplePopupWindow extends PopupWindow{private Context context;//屏幕的宽、高@SuppressWarnings("unused")private int screenWidth,screenHeight;//弹出框的位置private final int[] location = new int[2];//定义矩形private Rect rect = new Rect();private ListView listView;private int popupGravity = Gravity.NO_GRAVITY;private OnItemOnClickListener itemOnClickListener;//选项集合private ArrayList<ActionItem> actionItems = new ArrayList<ActionItem>();private boolean isDirty = false;//用于设置选中或取消private ImageView choice;public void setImageCon(ImageView choice){this.choice = choice;}public ExamplePopupWindow(Context context,int width,int height){this.context = context;//设置弹出窗体的宽this.setWidth(width);//设置弹出窗体的高this.setHeight(height);//设置窗体可击点this.setFocusable(true);this.setTouchable(true);this.setOutsideTouchable(true);//点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作this.setBackgroundDrawable(new ColorDrawable());screenWidth = Util.getScreenWidth(context);screenHeight = Util.getScreenHeight(context);//添加窗体的控件this.setContentView(LayoutInflater.from(context).inflate(R.layout.example_popup, null));initUI();//当窗体消失时回调该接口this.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() {// TODO Auto-generated method stubchoice.setSelected(false);}});}private void initUI(){listView = (ListView)this.getContentView().findViewById(R.id.title_list);listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stubdismiss();//Main_Activity才能获得actionItem对象if (itemOnClickListener != null)itemOnClickListener.onItemClick(actionItems.get(arg2),arg2);}});}public void show(View view){view.getLocationOnScreen(location);//只是为了得到底边Y值rect.set(location[0], location[1], location[0] + view.getWidth(),location[1] + view.getHeight());if (isDirty) {populateActions();}//设置窗体的位置showAtLocation(view, popupGravity, screenWidth - (getWidth() / 2),rect.bottom);choice.setSelected(true);}private void populateActions() {isDirty = false;listView.setAdapter(new BaseAdapter() {@Overridepublic View getView(int arg0, View arg1, ViewGroup arg2) {// TODO Auto-generated method stubTextView textView = null;if (arg1 == null) {textView = new TextView(context);textView.setTextColor(context.getResources().getColor(android.R.color.white));textView.setTextSize(14);// 设置文本居中textView.setGravity(Gravity.CENTER);// 设置文本域的范围textView.setPadding(0, 10, 0, 10);// 设置文本在一行内显示(不换行)textView.setSingleLine(true);} else {textView = (TextView) arg1;}ActionItem item = actionItems.get(arg0);// 设置文本文字textView.setText(item.mTitle);// 设置文字与图标的间隔textView.setCompoundDrawablePadding(10);// 设置在文字的左边放一个图标textView.setCompoundDrawablesWithIntrinsicBounds(item.mDrawable, null, null, null);// ///////////////////////////////////// 注意这段代码一定要写到上面那行代码的下面 要不然 就没有效果return textView;}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn arg0;}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn actionItems.get(arg0);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn actionItems.size();}});}public void addAction(ActionItem action) {if (action != null) {actionItems.add(action);isDirty = true;}}public void cleanAction() {if (actionItems.isEmpty()) {actionItems.clear();isDirty = true;}}public ActionItem getAction(int position) {if (position < 0 || position > actionItems.size())return null;return actionItems.get(position);}public void setItemOnClickListener(OnItemOnClickListener onItemOnClickListener) {this.itemOnClickListener = onItemOnClickListener;}public static interface OnItemOnClickListener{public void onItemClick(ActionItem item, int position);}}
ActionItem类
package com.example.popupwindowtest;import android.content.Context;import android.graphics.drawable.Drawable;public class ActionItem {// 定义图片对象public Drawable mDrawable;// 定义文本对象public CharSequence mTitle;public ActionItem(Drawable drawable, CharSequence title) {this.mDrawable = drawable;this.mTitle = title;}public ActionItem(Context context, int titleId, int drawableId) {this.mTitle = context.getResources().getText(titleId);this.mDrawable = context.getResources().getDrawable(drawableId);}public ActionItem(Context context, CharSequence title, int drawableId) {this.mTitle = title;this.mDrawable = context.getResources().getDrawable(drawableId);}}
Util类
package com.example.popupwindowtest;import android.content.Context; public class Util { /** * 得到设备屏幕的宽度 */ public static int getScreenWidth(Context context) { return context.getResources().getDisplayMetrics().widthPixels; } /** * 得到设备屏幕的高度 */ public static int getScreenHeight(Context context) { return context.getResources().getDisplayMetrics().heightPixels; } /** * 得到设备的密度 */ public static float getScreenDensity(Context context) { return context.getResources().getDisplayMetrics().density; } /** * 把密度转换为像素 */ public static int dip2px(Context context, float px) { final float scale = getScreenDensity(context); return (int) (px * scale + 0.5); } }
MainActivity类
package com.example.popupwindowtest;import com.example.popupwindowtest.ExamplePopupWindow.OnItemOnClickListener;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageView;import android.widget.LinearLayout.LayoutParams;public class MainActivity extends Activity{private ExamplePopupWindow examplePopupWindow;private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);examplePopupWindow = new ExamplePopupWindow(getApplicationContext(),LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);examplePopupWindow.addAction(new ActionItem(getApplicationContext(), "选项1", R.drawable.capture_topmenu));examplePopupWindow.addAction(new ActionItem(getApplicationContext(), "选项2", R.drawable.capture_topmenu));examplePopupWindow.addAction(new ActionItem(getApplicationContext(), "选项3", R.drawable.capture_topmenu));examplePopupWindow.setItemOnClickListener(new OnItemOnClickListener(){@Overridepublic void onItemClick(ActionItem item, int position) {// TODO Auto-generated method stubswitch (position) {case 0:System.out.println(item.mTitle);break;case 1:System.out.println(item.mTitle);break;case 3:System.out.println(item.mTitle);break;}}});imageView = (ImageView)this.findViewById(R.id.mainTop_SettingIR);imageView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubexamplePopupWindow.setImageCon(imageView);examplePopupWindow.show(arg0);}});}}
源码下载地址:http://download.csdn.net/detail/hardor/9105109
0 0
- android自定义PopupWindow组件
- android组件之PopupWindow
- android 自定义PopupWindow
- android自定义一个PopupWindow
- Android-自定义PopupWindow
- Android-自定义PopupWindow
- 5、Android-自定义PopupWindow
- Android 自定义PopupWindow
- Android开发自定义popupwindow
- Android-自定义PopupWindow
- Android 自定义PopupWindow技巧
- android自定义popupwindow动画
- Android-自定义PopupWindow
- Android开发 自定义popupwindow
- Android-自定义PopupWindow
- Android自定义PopupWindow
- Android-自定义PopupWindow
- android自定义popupWindow
- 应用直接共享cookie | cookie.setPath()用法
- URI in java
- javascript根据输入的本金实时计算本息和
- java 架构师
- quartz定时任务的使用
- android自定义PopupWindow组件
- tracert result
- 串口 同步和异步 理解
- ASPx组件访问模板中的控件
- ubuntu集群相关杂项
- Android 签名apk时候报conversion to dalvik format failed with error 1解决办法
- 绘制Android的机器人
- Android之值得开发者(安卓)必备的十八大开发资源
- 延长tableviewcell分割线到最左侧