利用popwindow实现在任意控件下的效果,只需改动showAsDropDown里的view的位置即可 看例子
下载地址http://download.csdn.net/detail/u012303938/8425361 代码如下
package com.example.popwindow;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
//三个按钮
private Button btn_1,btn_2,btn_3;
private PopupWindow mPopupWindow;
//pop布局
private View view;
private Context context;
//封装的数据
private ArrayList<Map<String, String>> mList;
//pop中的listview
private ListView mlv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
findView();
loadData();
addListoner();
}
private void loadData() {
// TODO Auto-generated method stub
mList=new ArrayList<Map<String,String>>();
for(int i=0;i<7;i++){
Map<String, String>map=new HashMap<String, String>();
map.put("name", "李四"+i);
map.put("no", "编号"+i);
mList.add(map);
}
}
private void addListoner() {
// TODO Auto-generated method stub
mlv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(context, "点击位置"+arg2, 1).show();
}
});
btn_1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
addView(btn_1);
MyAdapter adapter=new MyAdapter(context, mList);
mlv.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
});
btn_2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
addView(btn_2);
MyAdapter adapter=new MyAdapter(context, mList);
mlv.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
});
btn_3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
addView(btn_3);
MyAdapter adapter=new MyAdapter(context, mList);
mlv.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
});
}
private void findView() {
// TODO Auto-generated method stub
context=this;
btn_1=(Button) findViewById(R.id.btn_1);
btn_2=(Button) findViewById(R.id.btn_2);
btn_3=(Button) findViewById(R.id.btn_3);
view=View.inflate(context, R.layout.pop, null);
DisplayMetrics metrics=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
mPopupWindow=new PopupWindow(view, metrics.widthPixels/3, metrics.heightPixels*2/3);
mlv=(ListView) view.findViewById(R.id.mlv);
}
public void addView(Button btn){
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
mPopupWindow.setAnimationStyle(R.anim.popanim);
mPopupWindow.setFocusable(true);
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.showAsDropDown(btn, 0, 0);
}
private class MyAdapter extends BaseAdapter{
private ArrayList<Map<String, String>> list;
private Context context;
public MyAdapter(Context context,ArrayList<Map<String, String>> list) {
// TODO Auto-generated constructor stub
this.context=context;
if(list==null){
this.list=new ArrayList<Map<String,String>>();
}else{
this.list=list;
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View converView, ViewGroup arg2) {
// TODO Auto-generated method stub
Viewholder holder=new Viewholder();
if(converView==null){
View view=View.inflate(context, R.layout.pop_item, null);
converView=view;
holder.tv_name=(TextView) converView.findViewById(R.id.tv_name);
holder.tv_no=(TextView) converView.findViewById(R.id.tv_no);
holder.rl=(RelativeLayout) converView.findViewById(R.id.rl);
converView.setTag(holder);
}else{
holder=(Viewholder) converView.getTag();
}
holder.tv_name.setText(list.get(position).get("name"));
holder.tv_no.setText(list.get(position).get("no"));
return converView;
}
class Viewholder{
TextView tv_name,tv_no;
RelativeLayout rl;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/btn_1"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/select"
android:text="食品" />
<Button
android:layout_weight="1"
android:id="@+id/btn_2"
android:background="@drawable/select"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="休闲娱乐" />
<Button
android:layout_weight="1"
android:background="@drawable/select"
android:id="@+id/btn_3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="购物" />
</LinearLayout>
</RelativeLayout>
pop_item.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" >
<RelativeLayout
android:id="@+id/rl"
android:background="#22000000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_toRightOf="@+id/img"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="asd" />
<TextView
android:id="@+id/tv_no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="asd" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
pop.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" >
<ListView
android:id="@+id/mlv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
values中加colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#22ffffff</color>
<color name="gray">#33000000</color>
</resources>
drawable中加select.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@color/white"></item>
<item android:state_pressed="false" android:drawable="@color/gray"></item>
</selector>
res下加anim文件 在anim文件下加入popanim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0.2"
android:toAlpha="1.0"
android:duration="5000"
/>
<translate android:fromYDelta="10"
android:toYDelta="100"
android:duration="5000"/>
</set>