popupwindow实现弹出层

实现的效果描述:

当点击弹出层按钮后,弹出一个层popup1覆盖在主activity上,与此同时,在popup1和主activity之间再弹出一个popup2透明层,使得主activity失去焦点,只能点击popup1上的

控件。

popupwindow提供了显示提供了两种形式:

1-->showAtLocation()显示在指定位置,有两个方法重载:
public void showAtLocation(View parent, int gravity, int x, int y)
public void showAtLocation(IBinder token, int gravity, int x, int y)
2-->showAsDropDown()显示在一个参照物View的周围,有三个方法重载:
public void showAsDropDown(View anchor)
public void showAsDropDown(View anchor, int xoff, int yoff)
public void showAsDropDown(View anchor, int xoff, int yoff, int gravity)
最后一种带Gravity参数的方法是API 19新引入的。

这是主Activity的源码:

public classMainActivity extends Activity{


private ImageView pop=null; 
// 声明PopupWindow对象的引用 
private PopupWindow popupWindow; 
//覆盖在主界面上的透明层
private PopupWindow transPopupWindow; 
View popupWindow_view1 = null;


/* (non-Javadoc)
* @seeandroid.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(BundlesavedInstanceState) {
// TODO Auto-generated method stub
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.mainactivity_layout);



init();
}

private void init(){
// 点击按钮弹出菜单 
pop = (ImageView) findViewById(R.id.popBtn); 
pop.setOnClickListener(listener);
}

private OnClickListener listener = newOnClickListener() {

@Override
public void onClick(View v) {
if(v.getId()==R.id.popBtn){
//获取某一个控件在当前父窗口的坐标
final int[] location = new int[2]; 
pop.getLocationOnScreen(location);
//显示一个透明层,夹在弹出层和主界面之间,使主界面失去焦点
getTransPopupWindow();
transPopupWindow.showAtLocation(findViewById(R.id.parentID),Gravity.NO_GRAVITY,location[0], location[1]);

//显示弹出层
getPopupWindow(); 
popupWindow.showAtLocation(findViewById(R.id.parentID),Gravity.NO_GRAVITY,location[0], location[1]);
}
else if(v.getId()==R.id.open){
// 这里可以执行相关操作 
System.out.println("打开操作");
// 对话框消失 
popupWindow.dismiss();
transPopupWindow.dismiss();
}
else if(v.getId()==R.id.save){
// 这里可以执行相关操作 
System.out.println("保存操作"); 
popupWindow.dismiss(); 
transPopupWindow.dismiss();
}
}
};

protected void inittransPopupWindow() {
popupWindow_view1 =getLayoutInflater().inflate(R.layout.trans, null, false);
transPopupWindow = newPopupWindow(popupWindow_view1,findViewById(R.id.parentID).getWidth(),
findViewById(R.id.parentID).getHeight(), true);
transPopupWindow.setAnimationStyle(R.style.AnimationFade);
}

protected void initPopuptWindow() { 
// TODO Auto-generated method stub 
// 获取自定义布局文件pop.xml的视图 
View popupWindow_view = getLayoutInflater().inflate(R.layout.pop,null, false); 

//创建PopupWindow实例,设置popupWindow的宽和高分别为父控件的对应宽和高
popupWindow = new PopupWindow(popupWindow_view,findViewById(R.id.parentID).getWidth()/2,findViewById(R.id.parentID).getHeight(), true);
popupWindow.setAnimationStyle(R.style.AnimationFade); 

// pop.xml视图里面的控件 
Button open = (Button)popupWindow_view.findViewById(R.id.open); 
Button save = (Button)popupWindow_view.findViewById(R.id.save);

open.setOnClickListener(listener);
save.setOnClickListener(listener);
}

/*** 
* 获取PopupWindow实例 
*/ 
private void getPopupWindow() { 
if (null != popupWindow) { 
popupWindow.dismiss(); 
return; 
}
else { 
initPopuptWindow(); 



private void getTransPopupWindow() { 
if (null != transPopupWindow) { 
transPopupWindow.dismiss(); 
return; 
}
else { 
inittransPopupWindow(); 




}

布局文件:

<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/parentID"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
     <RelativeLayout
      
        android:layout_width="match_parent"
       android:layout_height="@dimen/title_height"
        android:background="@drawable/action_bar_bg_tile_horizontal"
        android:orientation="horizontal" >


        <ImageView
            android:id="@+id/popBtn"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_alignParentLeft="true"
           android:layout_alignParentTop="true"
           android:background="@drawable/personalsetting" />

        <TextView
           android:layout_width="wrap_content"
            android:layout_height="match_parent"
           android:layout_marginLeft="66dp"
           android:layout_toRightOf="@+id/popBtn"
           android:gravity="center_vertical"
            android:text="111"
           android:textColor="@color/white"
            android:textSize="@dimen/actionbar_textsize"
            android:textStyle="bold"/>
    </RelativeLayout>

</LinearLayout>

弹出层布局文件:

<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#C9C4C4"
android:orientation="vertical" >

<Button android:id="@+id/open" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/open"/> 

<Button android:id="@+id/save" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/save"/> 

</LinearLayout>

弹出透明层trans.xml

<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/trans"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" 
android:background="#00000000">
</LinearLayout>
styles.xml

  <stylename="AnimationFade"> 
<!-- PopupWindow左右弹出的效果--> 
<itemname="android:windowEnterAnimation">@anim/in_lefttoright</item> 
<itemname="android:windowExitAnimation">@anim/out_righttoleft</item> 
</style> 

in_lefttoright.xml

<?xmlversion="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- 定义从左向右进入的动画 --> 
<translate 
android:fromXDelta="-100%" 
android:toXDelta="0" 
android:duration="500"/> 
</set> 

out_righttoleft.xml

<?xmlversion="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- 定义从右向左动画退出动画 --> 
<translate 
android:fromXDelta="0" 
android:toXDelta="-100%" 
android:duration="500"/> 
</set> 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值