使用PopupWindow仿一个IOS底部弹窗
先定义一个PopupWindow
package com.aiguanggao.qqbottompop;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private PopupWindow mPop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showBottomPop(View view) {
showPop(view);
}
//初始化弹窗
private void initPop() {
if (mPop == null) {
View view = LayoutInflater.from(this).inflate(R.layout.pop_layout, null);
mPop = new PopupWindow(view, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
//点击弹窗外消失mPop
mPop.setFocusable(true);
mPop.setOutsideTouchable(true);
//设置背景,才能使用动画效果
mPop.setBackgroundDrawable(new BitmapDrawable());
//设置动画
mPop.setAnimationStyle(R.style.PopWindowAnim);
//设置弹窗消失监听
mPop.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 1f;
getWindow().setAttributes(lp);
}
});
//设置弹窗内的点击事件
setPopClickListener(view);
}
}
//显示弹窗
private void showPop(View v) {
initPop();
if (mPop.isShowing())
return;
//设置弹窗底部位置
mPop.showAtLocation(v, Gravity.BOTTOM, 0, 0);
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 0.6f;
getWindow().setAttributes(lp);
}
private void setPopClickListener(View view) {
TextView video, photo, cancle;
video = view.findViewById(R.id.video);
photo = view.findViewById(R.id.photo);
cancle = view.findViewById(R.id.cancle);
video.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "视频", Toast.LENGTH_SHORT).show();
}
});
photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "相册", Toast.LENGTH_SHORT).show();
}
});
cancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
mPop.dismiss();
}
});
}
}
再定义PopupWindow动画效果
弹窗进入动画
in_anim.xml
<?xml version="1.0" encoding="utf-8"?><!--进入动画-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromYDelta="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:toXDelta="0" />
弹窗退出动画
out_anim.xml
<?xml version="1.0" encoding="utf-8"?><!--进入动画-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromYDelta="0%"
android:interpolator="@android:anim/accelerate_interpolator"
android:toYDelta="100%" />
在style文件里定义动画效果
styles.xml
<!--弹窗动画-->
<style name="PopWindowAnim">
<item name="android:windowEnterAnimation">@anim/in_anim</item>
<item name="android:windowExitAnimation">@anim/out_anim</item>
</style>
定义一个圆角图片
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<solid android:color="#ddffffff" />
</shape>