PopupWindow 定点弹窗 完成效果 点哪儿 哪儿弹出窗口
显示效果:
PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。
首先配置XML文件(pop.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#c1c1c1"
android:gravity="center_horizontal"
android:orientation="vertical" >
<TextView
android:id="@+id/btn_pop"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_margin="10dip"
android:gravity="center"
android:text="弹窗" />
</LinearLayout>
然后在主类中进行具体操作
package com.example.popwindow;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
public class PopWindowActivity extends Activity {
private View view;
private PopupWindow popwindow;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//自定义方法
initPopupWindow();
}
// 实现onTouchEvent方法
public boolean onTouchEvent(MotionEvent event) {
// 如果是按下操作
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//自定义方法获取x,y的坐标
int x = (int) event.getX();
int y = (int) event.getY();
showXY(x, y);
}
return super.onTouchEvent(event);
}
private void showXY(float x, float y) {
//第一次点击和继续点击会有所差距,所以在这个地方需要对y轴进行操作
y-=200;
if (popwindow.isShowing()) {
popwindow.dismiss();
//因为当第一次点击时运行会正常,但是第二次点击时就会出现位置不同,所以根据坐标轴进行缩减达到目的
popwindow.showAsDropDown(view, (int)x, (int)y);
//还有一种方法就是通过定义x,y的坐标轴进行操作,通过使用showAtLocation方法指定弹窗位置和适配不同的分辨率
/*popwindow.showAtLocation(v, Gravity.CENTER, (int) event.getRawX() - x1
/ 2, (int) event.getRawY() - y1 / 2);*/
} else {
//本次点击是第一次点击,因为
y+=200;
popwindow.showAsDropDown(view, (int)x, (int)y);
//还有一种方法就是通过定义x,y的坐标轴进行操作,通过使用showAtLocation方法指定弹窗位置和适配不同的分辨率
/*popwindow.showAtLocation(v, Gravity.CENTER, (int) event.getRawX() - x1
/ 2, (int) event.getRawY() - y1 / 2);*/
}
}
private void initPopupWindow() {
//因为要弹出一个窗体,那么这个窗体就可以是view,将它放入类加载器里面进行加载
view = this.getLayoutInflater().inflate(R.layout.pop, null);
//实例化一个PopWindow
popwindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
}