【Android应用开发】EasyDialog 源码解析(二)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【Android应用开发】EasyDialog 源码解析(二)

4. 屏幕填充设置




设置是否填充屏幕 :



/**
  * 设置是否填充屏幕,如果不填充就适应布局内容的宽度,显示内容的位置会尽量随着三角形的位置居中
  */
  public EasyDialog setMatchParent(boolean matchParent) {
  ViewGroup.LayoutParams layoutParams = llContent.getLayoutParams();
  layoutParams.width = matchParent ? ViewGroup.LayoutParams.MATCH_PARENT
    : ViewGroup.LayoutParams.WRAP_CONTENT;
  llContent.setLayoutParams(layoutParams);
  return this;
  }

-- 填充屏幕样式 : 可以看到 填充全屏, 左右只留下了 margin;

image.png


-- 不填充屏幕样式 : 不会横向充满屏幕;


image.png












二. EasyDialog 主要源码





1. EasyDialog 包装类





package cn.org.octopus.easydialog;
import java.util.ArrayList;
import java.util.List;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.RotateDrawable;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class EasyDialog {
  /**
  * 上下文对象
  */
  private Context context;
  /**
  * 内容在三角形上面
  */
  public static final int GRAVITY_TOP = 0;
  /**
  * 内容在三角形下面
  */
  public static final int GRAVITY_BOTTOM = 1;
  /**
  * 对话框本身
  */
  private Dialog dialog;
  /**
  * 坐标
  */
  private int[] location;
  /**
  * 提醒框位置
  */
  private int gravity;
  /**
  * 外面传递进来的View
  */
  private View contentView;
  /**
  * 三角形
  */
  private ImageView ivTriangle;
  /**
  * 用来放外面传递进来的View
  */
  private LinearLayout llContent;
  /**
  * 触摸外面,是否关闭对话框
  */
  private boolean touchOutsideDismiss;
  /**
  * 提示框所在的容器
  */
  private RelativeLayout rlOutsideBackground;
  public EasyDialog(Context context) {
  initDialog(context);
  }
  /**
  * 初始化
  * @param context
  */
  private void initDialog(final Context context) {
  this.context = context;
  /*
   * 说明传入的对象是一个 Activity
   * 获取 Activity 的布局加载器
   */
  LayoutInflater layoutInflater = ((Activity) context)
    .getLayoutInflater();
  //要显示的对话框布局
  View dialogView = layoutInflater.inflate(R.layout.layout_dialog, null);
  /*
   * 获取对话框的宽 高
   * 不是真的获取对话框的宽高, 是在对话框被构建绘制到 布局中时 
   * 利用这个时机去设置对话框位置
   */
  ViewTreeObserver viewTreeObserver = dialogView.getViewTreeObserver();
  viewTreeObserver
    .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
      // 当View可以获取宽高的时候,设置view的位置
      relocation(location);
      }
    });
  //初始化对话框所在的容器
  rlOutsideBackground = (RelativeLayout) dialogView
    .findViewById(R.id.rlOutsideBackground);
  //为容器设置点击事件, 一旦点击, 就让对话框消失
  rlOutsideBackground.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    //关闭对话框前提 标志位true, 对话框不为 null
    if (touchOutsideDismiss && dialog != null) {
      onDialogDismiss();
    }
    return false;
    }
  });
  //对话框上部 或者 下部的 小三角形
  ivTriangle = (ImageView) dialogView.findViewById(R.id.ivTriangle);
  //对话框的长条
  llContent = (LinearLayout) dialogView.findViewById(R.id.llContent);
  //创建对话框
  dialog = new Dialog(
    context,
    isFullScreen() ? android.R.style.Theme_Translucent_NoTitleBar_Fullscreen
      : android.R.style.Theme_Translucent_NoTitleBar);
  //设置对话框布局
  dialog.setContentView(dialogView);
  //对话框显示动画
  animatorSetForDialogShow = new AnimatorSet();
  //对话框消失动画
  animatorSetForDialogDismiss = new AnimatorSet();
  objectAnimatorsForDialogShow = new ArrayList<>();
  objectAnimatorsForDialogDismiss = new ArrayList<>();
  //初始化默认值
  initData();
  }
  /**
  * 初始化默认值
  */
  private void initData() {
  this.setLocation(new int[] { 0, 0 })  //设置默认位置
    .setGravity(GRAVITY_BOTTOM)   //设置三角形位置 (上 或者 下)
    .setTouchOutsideDismiss(true)  //设置是否可以点击对话框消失
    .setOutsideColor(Color.TRANSPARENT) //设置对话框外部背景颜色
    .setBackgroundColor(Color.BLUE)  //设置对话框背景
    .setMatchParent(true)    //设置是否填充全屏
    .setMarginLeftAndRight(24, 24);  //设置左右margin
  }
  /**
  * 设置提示框中要显示的内容
  */
  public EasyDialog setLayout(View layout) {
  if (layout != null) {
    this.contentView = layout;
  }
  return this;
  }
  /**
  * 设置提示框中要显示的内容的布局Id
  */
  public EasyDialog setLayoutResourceId(int layoutResourceId) {
  View view = ((Activity) context).getLayoutInflater().inflate(
    layoutResourceId, null);
  setLayout(view);
  return this;
  }
  /**
  * 设置三角形所在的位置
  * 
  * @param location
  *    传入 x y 坐标
  * @return
  */
  public EasyDialog setLocation(int[] location) {
  this.location = location;
  return this;
  }
  /**
  * 设置三角形位置
  * -- x 坐标 : x坐标值为attachedView所在屏幕位置的中心
  * -- y 坐标 : y坐标值依据当前的gravity,如果gravity是top,则为控件上方的y值,如果是bottom,则为控件的下方的y值
  *
  * @param attachedView
  *            在哪个View显示提示信息
  */
  public EasyDialog setLocationByAttachedView(View attachedView) {
  if (attachedView != null) {
    //为成员变量赋值
    this.attachedView = attachedView;
    //该数组存储三角形位置数据
    int[] attachedViewLocation = new int[2];
    // 获取 attachedView 的位置, 左上角位置
    attachedView.getLocationOnScreen(attachedViewLocation);
    //计算 x 坐标, 即 attachedView 的中间位置
    attachedViewLocation[0] = attachedViewLocation[0]
      + attachedView.getWidth() / 2;
    //计算 y 坐标
    switch (gravity) {
    case GRAVITY_BOTTOM:
    //如果三角形在下, 即三角形位置是 attachedView 的下方
    attachedViewLocation[1] = attachedViewLocation[1]
      + attachedView.getHeight();
    break;
    case GRAVITY_TOP:
    //如果三角形在上, 即三角形位置是 attachedView 的上方, 即默认值
    break;
    }
    //设置三角形位置
    setLocation(attachedViewLocation);
  }
  return this;
  }
  /**
  * 对话框所依附的View
  * */
  private View attachedView = null;
  /**
  * 设置显示的内容在上方还是下方,如果设置错误,默认是在下方
  */
  public EasyDialog setGravity(int gravity) {
  //如果设置的位置值 既不是上 也不是下, 默认为下
  if (gravity != GRAVITY_BOTTOM && gravity != GRAVITY_TOP) {
    gravity = GRAVITY_BOTTOM;
  }
  //设置到成员变量中
  this.gravity = gravity;
  //设置三角形的图片, 
  switch (this.gravity) {
  case GRAVITY_BOTTOM:
    ivTriangle.setBackgroundResource(R.drawable.triangle_bottom);
    break;
  case GRAVITY_TOP:
    ivTriangle.setBackgroundResource(R.drawable.triangle_top);
    break;
  }
  //对话框 主题长条的 View
  llContent.setBackgroundResource(R.drawable.round_corner_bg);
  // 如果用户调用setGravity()之前就调用过setLocationByAttachedView,需要再调用一次setLocationByAttachedView
  if (attachedView != null) {
    this.setLocationByAttachedView(attachedView);
  }
  //设置对话框颜色
  this.setBackgroundColor(backgroundColor);
  return this;
  }
  /**
  * 设置是否填充屏幕,如果不填充就适应布局内容的宽度,显示内容的位置会尽量随着三角形的位置居中
  */
  public EasyDialog setMatchParent(boolean matchParent) {
  ViewGroup.LayoutParams layoutParams = llContent.getLayoutParams();
  layoutParams.width = matchParent ? ViewGroup.LayoutParams.MATCH_PARENT
    : ViewGroup.LayoutParams.WRAP_CONTENT;
  llContent.setLayoutParams(layoutParams);
  return this;
  }
  /**
  * 距离屏幕左右的边距
  * 设置对话框所在的整个容器的布局
  */
  public EasyDialog setMarginLeftAndRight(int left, int right) {
  RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) llContent
    .getLayoutParams();
  layoutParams.setMargins(left, 0, right, 0);
  llContent.setLayoutParams(layoutParams);
  return this;
  }
  /**
  * 设置触摸对话框外面,对话框是否消失
  */
  public EasyDialog setTouchOutsideDismiss(boolean touchOutsideDismiss) {
  this.touchOutsideDismiss = touchOutsideDismiss;
  return this;
  }
  /**
  * 设置提醒框外部区域的颜色
  */
  public EasyDialog setOutsideColor(int color) {
  rlOutsideBackground.setBackgroundColor(color);
  return this;
  }
  private int backgroundColor;
  /**
  * 设置对话框的颜色
  * <p/>
  * 三角形的图片是layer-list里面嵌套一个RotateDrawable,在设置颜色的时候需要特别处理
  * http://stackoverflow.
  * com/questions/24492000/set-color-of-triangle-on-run-time
  * http://stackoverflow
  * .com/questions/16636412/change-shape-solid-color-at-runtime
  * -inside-drawable-xml-used-as-background
  */
  public EasyDialog setBackgroundColor(int color) {
  backgroundColor = color;
  LayerDrawable drawableTriangle = (LayerDrawable) ivTriangle
    .getBackground();
  GradientDrawable shapeTriangle = (GradientDrawable) (((RotateDrawable) drawableTriangle
    .findDrawableByLayerId(R.id.shape_id)).getDrawable());
  if (shapeTriangle != null) {
    shapeTriangle.setColor(color);
  } else {
    Toast.makeText(context, "shape is null", Toast.LENGTH_SHORT).show();
  }
  GradientDrawable drawableRound = (GradientDrawable) llContent
    .getBackground();
  if (drawableRound != null) {
    drawableRound.setColor(color);
  }
  return this;
  }
  /**
  * 显示提示框
  * 
  * 这个对话框 整个填充全屏, 显示后, 执行里面的 小对话框 (小三角 和 提示框内容)
  */
  public EasyDialog show() {
  if (dialog != null) {
    if (contentView == null) {
    throw new RuntimeException(
      "您是否未调用setLayout()或者setLayoutResourceId()方法来设置要显示的内容呢?");
    }
    //设置对话框显示的内容
    llContent.addView(contentView);
    //显示整个对话框
    dialog.show();
    //显示小对话框的动画
    onDialogShowing();
  }
  return this;
  }
  /**
  * 显示对话框的View的parent,如果想自己写动画,可以获取这个实例来写动画
  *
  * */
  public View getTipViewInstance() {
  return rlOutsideBackground.findViewById(R.id.rlParentForAnimate);
  }
  /** 横向 */
  public static final int DIRECTION_X = 0;
  /** 纵向 */
  public static final int DIRECTION_Y = 1;
  /**
  * 水平动画
  *
  * @param direction
  *            动画的方向
  * @param duration
  *            动画执行的时间长度
  * @param values
  *            动画移动的位置
  * */
  public EasyDialog setAnimationTranslationShow(int direction, int duration,
    float... values) {
  return setAnimationTranslation(true, direction, duration, values);
  }
  /**
  * 水平动画
  *
  * @param direction
  *            动画的方向
  * @param duration
  *            动画执行的时间长度
  * @param values
  *            动画移动的位置
  * */
  public EasyDialog setAnimationTranslationDismiss(int direction,
    int duration, float... values) {
  return setAnimationTranslation(false, direction, duration, values);
  }
  private EasyDialog setAnimationTranslation(boolean isShow, int direction,
    int duration, float... values) {
  if (direction != DIRECTION_X && direction != DIRECTION_Y) {
    direction = DIRECTION_X;
  }
  String propertyName = "";
  switch (direction) {
  case DIRECTION_X:
    propertyName = "translationX";
    break;
  case DIRECTION_Y:
    propertyName = "translationY";
    break;
  }
  ObjectAnimator animator = ObjectAnimator.ofFloat(
    rlOutsideBackground.findViewById(R.id.rlParentForAnimate),
    propertyName, values).setDuration(duration);
  if (isShow) {
    objectAnimatorsForDialogShow.add(animator);
  } else {
    objectAnimatorsForDialogDismiss.add(animator);
  }
  return this;
  }
  /**
  * 对话框出现时候的渐变动画
  *
  * @param duration
  *            动画执行的时间长度
  * @param values
  *            动画移动的位置
  * */
  public EasyDialog setAnimationAlphaShow(int duration, float... values) {
  return setAnimationAlpha(true, duration, values);
  }
  /**
  * 对话框消失时候的渐变动画
  *
  * @param duration
  *            动画执行的时间长度
  * @param values
  *            动画移动的位置
  * */
  public EasyDialog setAnimationAlphaDismiss(int duration, float... values) {
  return setAnimationAlpha(false, duration, values);
  }
  private EasyDialog setAnimationAlpha(boolean isShow, int duration,
    float... values) {
  ObjectAnimator animator = ObjectAnimator.ofFloat(
    rlOutsideBackground.findViewById(R.id.rlParentForAnimate),
    "alpha", values).setDuration(duration);
  if (isShow) {
    objectAnimatorsForDialogShow.add(animator);
  } else {
    objectAnimatorsForDialogDismiss.add(animator);
  }
  return this;
  }
  private AnimatorSet animatorSetForDialogShow;
  private AnimatorSet animatorSetForDialogDismiss;
  private List<Animator> objectAnimatorsForDialogShow;
  private List<Animator> objectAnimatorsForDialogDismiss;
  /**
  * 对话框显示的动画
  */
  private void onDialogShowing() {
  if (animatorSetForDialogShow != null
    && objectAnimatorsForDialogShow != null
    && objectAnimatorsForDialogShow.size() > 0) {
    animatorSetForDialogShow.playTogether(objectAnimatorsForDialogShow);
    animatorSetForDialogShow.start();
  }
  }
  /**
  * 对话框消失的动画
  */
  private void onDialogDismiss() {
  if (animatorSetForDialogDismiss.isRunning()) {
    return;
  }
  if (animatorSetForDialogDismiss != null
    && objectAnimatorsForDialogDismiss != null
    && objectAnimatorsForDialogDismiss.size() > 0) {
    animatorSetForDialogDismiss
      .playTogether(objectAnimatorsForDialogDismiss);
    animatorSetForDialogDismiss.start();
    animatorSetForDialogDismiss
      .addListener(new Animator.AnimatorListener() {
      @Override
      public void onAnimationStart(Animator animation) {
      }
      @Override
      public void onAnimationEnd(Animator animation) {
        dialog.dismiss();
      }
      @Override
      public void onAnimationCancel(Animator animation) {
      }
      @Override
      public void onAnimationRepeat(Animator animation) {
      }
      });
  } else {
    dialog.dismiss();
  }
  }
  /**
  * 关闭提示框
  */
  public void dismiss() {
  if (dialog != null && dialog.isShowing()) {
    onDialogDismiss();
  }
  }
  /**
  * 根据x,y,重新设置控件的位置
  * 
  * 因为setX setY为0的时候,都是在状态栏以下的,所以app不是全屏的话,需要扣掉状态栏的高度
  */
  private void relocation(int[] location) {
  ivTriangle.setX(location[0] - ivTriangle.getWidth() / 2);
  ivTriangle.setY(location[1] - ivTriangle.getHeight() / 2
    - (isFullScreen() ? 0.0f : getStatusBarHeight()));// 因为三角形是通过XML绘制出来的,可以到activity_tip_overlay.xml中把三角形的那个ImageView背景设置一下,就知道什么情况了。所以需要减掉一半的高度
  switch (gravity) {
  case GRAVITY_BOTTOM:
    llContent.setY(location[1] - ivTriangle.getHeight() / 2
      - (isFullScreen() ? 0.0f : getStatusBarHeight())
      + ivTriangle.getHeight());
    break;
  case GRAVITY_TOP:
    llContent.setY(location[1] - llContent.getHeight()
      - (isFullScreen() ? 0.0f : getStatusBarHeight())
      - ivTriangle.getHeight() / 2);
    break;
  }
  // 显示内容的区域往三角形靠拢
  int triangleCenterX = (int) (ivTriangle.getX() + ivTriangle.getWidth() / 2);// 三角形的中心点
  int contentWidth = llContent.getWidth();
  int rightMargin = getScreenWidth() - triangleCenterX;// 三角形中心距离屏幕右边的距离
  int leftMargin = getScreenWidth() - rightMargin;// 三角形中心距离屏幕左边的距离
  RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) llContent
    .getLayoutParams();
  int availableLeftMargin = leftMargin - layoutParams.leftMargin;// 左边可用的距离
  int availableRightMargin = rightMargin - layoutParams.rightMargin;// 右边可用的距离
  int x = 0;
  if (contentWidth / 2 <= availableLeftMargin
    && contentWidth / 2 <= availableRightMargin)// 左右两边有足够的距离
  {
    x = triangleCenterX - contentWidth / 2;
  } else {
    if (availableLeftMargin <= availableRightMargin)// 判断三角形在屏幕中心的左边
    {
    x = layoutParams.leftMargin;
    } else// 三角形在屏幕中心的右边
    {
    x = getScreenWidth()
      - (contentWidth + layoutParams.rightMargin);
    }
  }
  llContent.setX(x);
  }
  /**
  * 获取屏幕的宽度
  * */
  private int getScreenWidth() {
  DisplayMetrics metrics = context.getResources().getDisplayMetrics();
  return metrics.widthPixels;
  }
  /**
  * 获取状态栏的高度
  */
  private int getStatusBarHeight() {
  int result = 0;
  int resourceId = context.getResources().getIdentifier(
    "status_bar_height", "dimen", "android");
  if (resourceId > 0) {
    result = context.getResources().getDimensionPixelSize(resourceId);
  }
  return result;
  }
  /**
  * 判断下当前要显示对话框的Activity是否是全屏
  */
  public boolean isFullScreen() {
  int flg = ((Activity) context).getWindow().getAttributes().flags;
  boolean flag = false;
  if ((flg & 1024) == 1024) {
    flag = true;
  }
  return flag;
  }
  /**
  * 设置是否可以按返回按钮取消
  * */
  public EasyDialog setCancelable(boolean cancelable) {
  dialog.setCancelable(cancelable);
  return this;
  }
  }






2. EasyDialog 调用



package cn.org.octopus.easydialog;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity implements View.OnClickListener
{
    private RelativeLayout rlBackground;
    private Button btnTopLeft;
    private Button btnTopRight;
    private Button btnMiddleTop;
    private Button btnMiddleBottom;
    private Button btnBottomLeft;
    private Button btnBottomRight;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iniComponent();
    }
    private void iniComponent()
    {
        rlBackground = (RelativeLayout)findViewById(R.id.rlBackground);
        btnTopLeft = (Button) findViewById(R.id.btnTopLeft);
        btnTopRight = (Button) findViewById(R.id.btnTopRight);
        btnMiddleTop = (Button) findViewById(R.id.btnMiddleTop);
        btnMiddleBottom = (Button) findViewById(R.id.btnMiddleBottom);
        btnBottomLeft = (Button) findViewById(R.id.btnBottomLeft);
        btnBottomRight = (Button) findViewById(R.id.btnBottomRight);
        btnTopLeft.setOnClickListener(this);
        btnTopRight.setOnClickListener(this);
        btnMiddleTop.setOnClickListener(this);
        btnMiddleBottom.setOnClickListener(this);
        btnBottomLeft.setOnClickListener(this);
        btnBottomRight.setOnClickListener(this);
        rlBackground.setOnTouchListener(new View.OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                int[] location = new int[2];
                location[0] = (int)event.getX();
                location[1] = (int)event.getY();
                location[1] = location[1] + getActionBarHeight() + getStatusBarHeight();
                Toast.makeText(MainActivity.this, "x:" + location[0] + " y:" + location[1], Toast.LENGTH_SHORT).show();
                new EasyDialog(MainActivity.this)
                        .setLayoutResourceId(R.layout.layout_tip_content_horizontal)
                        .setBackgroundColor(MainActivity.this.getResources().getColor(R.color.background_color_black))
                        .setLocation(location)
                        .setGravity(EasyDialog.GRAVITY_TOP)
                        .setTouchOutsideDismiss(true)
                        .setMatchParent(false)
                        .setMarginLeftAndRight(24, 24)
                        .setOutsideColor(MainActivity.this.getResources().getColor(R.color.outside_color_gray))
                        .show();
                return false;
            }
        });
    }
    @Override
    public void onClick(View v)
    {
        switch (v.getId())
        {
            case R.id.btnTopLeft:
                View view = this.getLayoutInflater().inflate(R.layout.layout_tip_content_horizontal, null);
                new EasyDialog(MainActivity.this)
                        .setLayout(view)
                        .setBackgroundColor(MainActivity.this.getResources().getColor(R.color.background_color_black))
                        .setLocationByAttachedView(btnTopLeft)
                        .setGravity(EasyDialog.GRAVITY_BOTTOM)
                        .setAnimationTranslationShow(EasyDialog.DIRECTION_X, 1000, -600, 100, -50, 50, 0)
                        .setAnimationAlphaShow(1000, 0.3f, 1.0f)
                        .setAnimationTranslationDismiss(EasyDialog.DIRECTION_X, 500, -50, 800)
                        .setAnimationAlphaDismiss(500, 1.0f, 0.0f)
                        .setTouchOutsideDismiss(true)
                        .setMatchParent(true)
                        .setMarginLeftAndRight(24, 24)
                        .setOutsideColor(MainActivity.this.getResources().getColor(R.color.outside_color_trans))
                        .show();
                break;
            case R.id.btnTopRight:
                new EasyDialog(MainActivity.this)
                        .setLayoutResourceId(R.layout.layout_tip_image_text)
                        .setGravity(EasyDialog.GRAVITY_BOTTOM)
                        .setBackgroundColor(MainActivity.this.getResources().getColor(R.color.background_color_black))
                        .setLocationByAttachedView(btnTopRight)
                        .setAnimationTranslationShow(EasyDialog.DIRECTION_X, 350, 400, 0)
                        .setAnimationTranslationDismiss(EasyDialog.DIRECTION_X, 350, 0, 400)
                        .setTouchOutsideDismiss(true)
                        .setMatchParent(false)
                        .setMarginLeftAndRight(24, 24)
                        .setOutsideColor(MainActivity.this.getResources().getColor(R.color.outside_color_trans))
                        .show();
                break;
            case R.id.btnMiddleTop:
                new EasyDialog(MainActivity.this)
                        .setLayoutResourceId(R.layout.layout_tip_content_horizontal)
                        .setBackgroundColor(MainActivity.this.getResources().getColor(R.color.background_color_blue))
                        .setLocationByAttachedView(btnMiddleTop)
                        .setAnimationTranslationShow(EasyDialog.DIRECTION_Y, 1000, -800, 100, -50, 50, 0)
                        .setAnimationTranslationDismiss(EasyDialog.DIRECTION_Y, 500, 0, -800)
                        .setGravity(EasyDialog.GRAVITY_TOP)
                        .setTouchOutsideDismiss(true)
                        .setMatchParent(false)
                        .setMarginLeftAndRight(24, 24)
                        .setOutsideColor(MainActivity.this.getResources().getColor(R.color.outside_color_pink))
                        .show();
                break;
            case R.id.btnMiddleBottom:
                new EasyDialog(MainActivity.this)
                        .setLayoutResourceId(R.layout.layout_tip_content_horizontal)
                        .setGravity(EasyDialog.GRAVITY_BOTTOM)
                        .setBackgroundColor(MainActivity.this.getResources().getColor(R.color.background_color_brown))
                        .setLocationByAttachedView(btnMiddleBottom)
                        .setAnimationTranslationShow(EasyDialog.DIRECTION_Y, 1000, 800, -100, -50, 50, 0)
                        .setAnimationTranslationDismiss(EasyDialog.DIRECTION_Y, 500, 0, 800)
                        .setAnimationAlphaShow(1000, 0.3f, 1.0f)
                        .setTouchOutsideDismiss(true)
                        .setMatchParent(true)
                        .setMarginLeftAndRight(24, 24)
                        .setOutsideColor(MainActivity.this.getResources().getColor(R.color.outside_color_gray))
                        .show();
                break;
            case R.id.btnBottomLeft:
                new EasyDialog(MainActivity.this)
                        .setLayoutResourceId(R.layout.layout_tip_text)
                        .setBackgroundColor(MainActivity.this.getResources().getColor(R.color.background_color_pink))
                        .setLocationByAttachedView(btnBottomLeft)
                        .setGravity(EasyDialog.GRAVITY_TOP)
                        .setAnimationAlphaShow(600, 0.0f, 1.0f)
                        .setAnimationAlphaDismiss(600, 1.0f, 0.0f)
                        .setTouchOutsideDismiss(true)
                        .setMatchParent(false)
                        .setMarginLeftAndRight(24, 24)
                        .setOutsideColor(MainActivity.this.getResources().getColor(R.color.outside_color_trans))
                        .show();
                break;
            case R.id.btnBottomRight:
                new EasyDialog(MainActivity.this)
                        .setLayoutResourceId(R.layout.layout_tip_image_text)
                        .setBackgroundColor(MainActivity.this.getResources().getColor(R.color.background_color_yellow))
                        .setLocationByAttachedView(btnBottomRight)
                        .setGravity(EasyDialog.GRAVITY_TOP)
                        .setAnimationTranslationShow(EasyDialog.DIRECTION_X, 300, 400, 0)
                        .setAnimationTranslationShow(EasyDialog.DIRECTION_Y, 300, 400, 0)
                        .setAnimationTranslationDismiss(EasyDialog.DIRECTION_X, 300, 0, 400)
                        .setAnimationTranslationDismiss(EasyDialog.DIRECTION_Y, 300, 0, 400)
                        .setTouchOutsideDismiss(true)
                        .setMatchParent(false)
                        .setMarginLeftAndRight(24, 24)
                        .setOutsideColor(MainActivity.this.getResources().getColor(R.color.outside_color_trans))
                        .show();
                break;
        }
    }
    private int getStatusBarHeight()
    {
        int result = 0;
        int resourceId = this.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0)
        {
            result = this.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
    private int getActionBarHeight()
    {
        return this.getSupportActionBar().getHeight();
    }
}





目录
相关文章
|
15天前
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
194 11
|
2月前
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
2月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
14天前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
184 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
13天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
107 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
1月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
1月前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
缓存 监控 前端开发
探索Android应用开发之旅:从新手到专家
【10月更文挑战第42天】本文将带你踏上Android应用开发的旅程,无论你是初学者还是有经验的开发者。我们将一起探索如何从零开始创建你的第一个Android应用,并逐步深入到更高级的主题,如自定义视图、网络编程和性能优化。通过实际示例和清晰的解释,你将学会如何构建高效、吸引人的Android应用。让我们一起开启这段激动人心的旅程吧!
|
2月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。

推荐镜像

更多