设置对话框大小和位置

实际中,经常需要比较灵活地控制对话框大小和位置。Android中提供了相应的API,使用起来也还算方便,下面举个例子:

MainActivity:

package com.home.dialog;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		ImageView iv = new ImageView(this);
		iv.setImageResource(R.drawable.ic_launcher);
		Dialog dialog = new Dialog(this, R.style.NoBorderDialog);
		dialog.setContentView(iv);
		dialog.show();
		Window dialogWindow = dialog.getWindow();
		// 设置大概位置
		dialogWindow.setGravity(Gravity.LEFT);
		// dialogWindow.setGravity(Gravity.RIGHT);
		// dialogWindow.setGravity(Gravity.TOP);
		// dialogWindow.setGravity(Gravity.BOTTOM);
		// dialogWindow.setGravity(Gravity.CENTER_HORIZONTAL);
		// dialogWindow.setGravity(Gravity.CENTER_VERTICAL);
		// dialogWindow.setGravity(Gravity.CENTER);
		// 也可以进行组合设置,如
//		dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);

		// 设置具体参数
		WindowManager.LayoutParams lp = dialogWindow.getAttributes();
		// 设置偏移
		lp.x = 30;
		lp.y = 50;

		// 设置宽高
		lp.width = 300;
		lp.height = 300;

		// 也可按屏幕宽高比例进行设置宽高
		Display display = getWindowManager().getDefaultDisplay();
		lp.width = (int) (display.getWidth() * 0.8);
		lp.height = (int) (display.getHeight() * 0.4);

		// 设置透明度
		lp.alpha = 0.7f;
		dialogWindow.setAttributes(lp);
	}

}

对于设置lp偏移,引用网上的解释:

/*

* lp.x与lp.y表示相对于原始位置的偏移.
* 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
* 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
* 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
* 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
* 当参数值包含Gravity.CENTER_HORIZONTAL时
* ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
* 当参数值包含Gravity.CENTER_VERTICAL时
* ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
* gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
* Gravity.CENTER_VERTICAL.
*
* 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在
* 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了,
* Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
*//*
* lp.x与lp.y表示相对于原始位置的偏移.
* 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
* 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
* 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
* 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
* 当参数值包含Gravity.CENTER_HORIZONTAL时
* ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
* 当参数值包含Gravity.CENTER_VERTICAL时
* ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
* gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
* Gravity.CENTER_VERTICAL.
*
* 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在
* 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了,
* Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
*/

转载于:https://my.oschina.net/secyaher/blog/274413

猜你喜欢

转载自blog.csdn.net/weixin_33675507/article/details/91967219