869d8d05c99d4785b18cfc65117a7deca8702ac5.svn-base 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package com.hjq.widget.square;
  2. import android.view.View;
  3. /**
  4. * desc : 用于限定正方形大小的控件的算法
  5. */
  6. public final class SquareDelegate {
  7. /**
  8. * 测量出正方形的宽度
  9. *
  10. * @param widthMeasureSpec onMeasure中的同名参数
  11. * @param heightMeasureSpec onMeasure中的同名参数
  12. * @return 返回用于测量的参数
  13. */
  14. public static int measureWidth(int widthMeasureSpec, int heightMeasureSpec) {
  15. int widthSpecMode = View.MeasureSpec.getMode(widthMeasureSpec);
  16. int widthSpecSize = View.MeasureSpec.getSize(widthMeasureSpec);
  17. int heightSpecMode = View.MeasureSpec.getMode(heightMeasureSpec);
  18. int heightSpecSize = View.MeasureSpec.getSize(heightMeasureSpec);
  19. // 如果当前宽度不是写死的
  20. if (widthSpecMode != View.MeasureSpec.EXACTLY) {
  21. // 如果当前高度不是写死的
  22. if (heightSpecMode != View.MeasureSpec.EXACTLY) {
  23. // 对比高度和宽度,返回最大值的那个
  24. return View.MeasureSpec.makeMeasureSpec(Math.max(widthSpecSize, heightSpecSize), View.MeasureSpec.EXACTLY);
  25. }else {
  26. // 如果已经定死了高度,而宽度没有写死,则使用高度代替宽度
  27. return heightMeasureSpec;
  28. }
  29. }else {
  30. // 宽度和高度已经写死,这里不做任何处理
  31. return widthMeasureSpec;
  32. }
  33. }
  34. /**
  35. * 测量出正方形的高度
  36. *
  37. * @param widthMeasureSpec onMeasure中的同名参数
  38. * @param heightMeasureSpec onMeasure中的同名参数
  39. * @return 返回用于测量的参数
  40. */
  41. public static int measureHeight(int widthMeasureSpec, int heightMeasureSpec) {
  42. int widthSpecMode = View.MeasureSpec.getMode(widthMeasureSpec);
  43. int widthSpecSize = View.MeasureSpec.getSize(widthMeasureSpec);
  44. int heightSpecMode = View.MeasureSpec.getMode(heightMeasureSpec);
  45. int heightSpecSize = View.MeasureSpec.getSize(heightMeasureSpec);
  46. // 如果当前高度不是写死的
  47. if (heightSpecMode != View.MeasureSpec.EXACTLY) {
  48. // 如果当前宽度不是写死的
  49. if (widthSpecMode != View.MeasureSpec.EXACTLY) {
  50. // 对比高度和宽度,返回最大值的那个
  51. return View.MeasureSpec.makeMeasureSpec(Math.max(widthSpecSize, heightSpecSize), View.MeasureSpec.EXACTLY);
  52. }else {
  53. // 如果已经定死了宽度,而高度没有写死,则使用高度代替宽度
  54. return widthMeasureSpec;
  55. }
  56. }else {
  57. // 宽度和高度已经写死,这里不做任何处理
  58. return heightMeasureSpec;
  59. }
  60. }
  61. }