import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.example.zl.myapplication.R;
public class SlideDialogActivity extends AppCompatActivity{
public ImageView mImageView;
//主弹框相关
Dialog mCameraDialog;
LinearLayout ll_close;
//手势监听相关
float mPosX, mPosY;
float mCurPosX, mCurPosY;
public void showDialogSetting() {
dialogSetting();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_slidedialog);
mImageView = findViewById(R.id.img_dialogdown);
// 点击和触摸一起监听,会忽略点击事件
/*mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialogSetting();
}
});*/
setGestureListener();
}
public void dialogSetting() {
mCameraDialog = new Dialog(this, R.style.my_dialog);
LinearLayout root = (LinearLayout) LayoutInflater.from(this).inflate(
R.layout.dialog_home_land, null);
mCameraDialog.setContentView(root);
/**
* 弹出框最上端的横线,下拉关闭弹出框
*/
ll_close = root.findViewById(R.id.ll_close);
ll_close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCameraDialog.dismiss();
}
});
//对该横线进行下滑的监听 关闭
setGestureListenerClose();
Window dialogWindow = mCameraDialog.getWindow();
dialogWindow.setGravity(Gravity.BOTTOM);
dialogWindow.setWindowAnimations(R.style.dialogstyle); // 添加动画
WindowManager.LayoutParams lp = dialogWindow.getAttributes(); // 获取对话框当前的参数值
lp.x = 0; // 新位置X坐标
lp.y = -20; // 新位置Y坐标
lp.width = getResources().getDisplayMetrics().widthPixels; // 宽度
lp.height = LinearLayout.LayoutParams.WRAP_CONTENT;
lp.alpha = 9f; // 透明度
dialogWindow.setAttributes(lp);
mCameraDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
mImageView.setVisibility(View.VISIBLE);
}
});
mCameraDialog.show();
}
/**
* 手势监控
* 上下滑动监听器
*/
private void setGestureListener() {
mImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPosX = event.getX();
mPosY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurPosX = event.getX();
mCurPosY = event.getY();
break;
case MotionEvent.ACTION_UP:
if (mCurPosY - mPosY > 0 && (Math.abs(mCurPosY - mPosY) > 25)) {
//向下滑动
} else if (mCurPosY - mPosY < 0 && (Math.abs(mCurPosY - mPosY) > 25)) {
//向上滑动
showDialogSetting();
}
break;
}
return true;
}
});
}
/**
* 弹出框显示时对上横线下滑关闭的监听
*/
private void setGestureListenerClose() {
ll_close.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPosX = event.getX();
mPosY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurPosX = event.getX();
mCurPosY = event.getY();
break;
case MotionEvent.ACTION_UP:
if (mCurPosY - mPosY > 0 && (Math.abs(mCurPosY - mPosY) > 25)) {
//向下滑动
mCameraDialog.dismiss();
} else if (mCurPosY - mPosY < 0 && (Math.abs(mCurPosY - mPosY) > 25)) {
//向上滑动
}
break;
}
return true;
}
});
}
}
R.layout.activity_slidedialog
<?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"
android:background="@color/colorAccent">
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<ImageView
android:id="@+id/img_dialogdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="30dp"
android:src="@drawable/home_down"/>
</LinearLayout>
R.layout.dialog_home_land
<?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="wrap_content"
android:orientation="vertical"
android:background="#fee5e1e1">
<LinearLayout
android:id="@+id/ll_close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="36dp"
android:paddingTop="12dp">
<TextView
android:layout_width="80dp"
android:layout_height="3dp"
android:layout_gravity="center_horizontal"
android:background="#801c232d"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
R.style.my_dialog
R.style.dialogstyle
<style name="my_dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowCloseOnTouchOutside">true</item>
</style>
<style name="dialogstyle" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_enter</item>
<item name="android:windowExitAnimation">@anim/dialog_exit</item>
</style>
@anim/dialog_enter
@anim/dialog_exit
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromYDelta="100%p" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:toYDelta="100%p" />
</set>
home_down.png