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
原创粉丝点击