0bc7a69134a19cfaf3940e30adc4c2a2a74ad248.svn-base 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. package eVVM.apk.helper;
  2. import android.annotation.TargetApi;
  3. import android.graphics.drawable.ColorDrawable;
  4. import android.graphics.drawable.Drawable;
  5. import android.graphics.drawable.GradientDrawable;
  6. import android.os.Build;
  7. import android.support.annotation.ColorInt;
  8. import android.support.annotation.DrawableRes;
  9. import android.support.annotation.Nullable;
  10. import android.support.annotation.StringRes;
  11. import android.support.design.widget.CoordinatorLayout;
  12. import android.support.design.widget.Snackbar;
  13. import android.util.Log;
  14. import android.view.Gravity;
  15. import android.view.LayoutInflater;
  16. import android.view.View;
  17. import android.view.ViewGroup;
  18. import android.widget.Button;
  19. import android.widget.FrameLayout;
  20. import android.widget.LinearLayout;
  21. import android.widget.Space;
  22. import android.widget.TextView;
  23. import java.lang.ref.WeakReference;
  24. import eVVM.apk.R;
  25. /**
  26. * Created by Android Studio.
  27. * User: zbb
  28. * Date: 2019/7/2
  29. * Describe: SnackbarUtils
  30. */
  31. public class SnackbarUtils {
  32. //设置Snackbar背景颜色
  33. private static final int color_info = 0XFF2094F3;
  34. private static final int color_confirm = 0XFF4CB04E;
  35. private static final int color_warning = 0XFFFEC005;
  36. private static final int color_danger = 0XFFF44336;
  37. //工具类当前持有的Snackbar实例
  38. private static WeakReference<Snackbar> snackbarWeakReference;
  39. private SnackbarUtils(){
  40. throw new RuntimeException("禁止无参创建实例");
  41. }
  42. private SnackbarUtils(@Nullable WeakReference<Snackbar> snackbarWeakReference){
  43. this.snackbarWeakReference = snackbarWeakReference;
  44. }
  45. /**
  46. * 获取 mSnackbar
  47. * @return
  48. */
  49. public Snackbar getSnackbar() {
  50. if(this.snackbarWeakReference != null && this.snackbarWeakReference.get()!=null){
  51. return this.snackbarWeakReference.get();
  52. }else {
  53. return null;
  54. }
  55. }
  56. /**
  57. * 初始化Snackbar实例
  58. * 展示时间:Snackbar.LENGTH_SHORT
  59. * @param view
  60. * @param message
  61. * @return
  62. */
  63. public static SnackbarUtils Short(View view, String message){
  64. /*
  65. <view xmlns:android="http://schemas.android.com/apk/res/android"
  66. class="android.support.design.widget.Snackbar$SnackbarLayout"
  67. android:layout_width="match_parent"
  68. android:layout_height="wrap_content"
  69. android:layout_gravity="bottom"
  70. android:theme="@style/ThemeOverlay.AppCompat.Dark"
  71. style="@style/Widget.Design.Snackbar" />
  72. <style name="Widget.Design.Snackbar" parent="android:Widget">
  73. <item name="android:minWidth">@dimen/design_snackbar_min_width</item>
  74. <item name="android:maxWidth">@dimen/design_snackbar_max_width</item>
  75. <item name="android:background">@drawable/design_snackbar_background</item>
  76. <item name="android:paddingLeft">@dimen/design_snackbar_padding_horizontal</item>
  77. <item name="android:paddingRight">@dimen/design_snackbar_padding_horizontal</item>
  78. <item name="elevation">@dimen/design_snackbar_elevation</item>
  79. <item name="maxActionInlineWidth">@dimen/design_snackbar_action_inline_max_width</item>
  80. </style>
  81. <shape xmlns:android="http://schemas.android.com/apk/res/android"
  82. android:shape="rectangle">
  83. <corners android:radius="@dimen/design_snackbar_background_corner_radius"/>
  84. <solid android:color="@color/design_snackbar_background_color"/>
  85. </shape>
  86. <color name="design_snackbar_background_color">#323232</color>
  87. */
  88. return new SnackbarUtils(new WeakReference<Snackbar>(Snackbar.make(view,message,Snackbar.LENGTH_SHORT))).backColor(0XFF323232);
  89. }
  90. /**
  91. * 初始化Snackbar实例
  92. * 展示时间:Snackbar.LENGTH_LONG
  93. * @param view
  94. * @param message
  95. * @return
  96. */
  97. public static SnackbarUtils Long(View view, String message){
  98. return new SnackbarUtils(new WeakReference<Snackbar>(Snackbar.make(view,message,Snackbar.LENGTH_LONG))).backColor(0XFF323232);
  99. }
  100. /**
  101. * 初始化Snackbar实例
  102. * 展示时间:Snackbar.LENGTH_INDEFINITE
  103. * @param view
  104. * @param message
  105. * @return
  106. */
  107. public static SnackbarUtils Indefinite(View view, String message){
  108. return new SnackbarUtils(new WeakReference<Snackbar>(Snackbar.make(view,message,Snackbar.LENGTH_INDEFINITE))).backColor(0XFF323232);
  109. }
  110. /**
  111. * 初始化Snackbar实例
  112. * 展示时间:duration 毫秒
  113. * @param view
  114. * @param message
  115. * @param duration 展示时长(毫秒)
  116. * @return
  117. */
  118. public static SnackbarUtils Custom(View view, String message, int duration){
  119. return new SnackbarUtils(new WeakReference<Snackbar>(Snackbar.make(view,message,Snackbar.LENGTH_SHORT).setDuration(duration))).backColor(0XFF323232);
  120. }
  121. /**
  122. * 设置mSnackbar背景色为 color_info
  123. */
  124. public SnackbarUtils info(){
  125. if(getSnackbar()!=null){
  126. getSnackbar().getView().setBackgroundColor(color_info);
  127. }
  128. return this;
  129. }
  130. /**
  131. * 设置mSnackbar背景色为 color_confirm
  132. */
  133. public SnackbarUtils confirm(){
  134. if(getSnackbar()!=null){
  135. getSnackbar().getView().setBackgroundColor(color_confirm);
  136. }
  137. return this;
  138. }
  139. /**
  140. * 设置Snackbar背景色为 color_warning
  141. */
  142. public SnackbarUtils warning(){
  143. if(getSnackbar()!=null){
  144. getSnackbar().getView().setBackgroundColor(color_warning);
  145. }
  146. return this;
  147. }
  148. /**
  149. * 设置Snackbar背景色为 color_warning
  150. */
  151. public SnackbarUtils danger(){
  152. if(getSnackbar()!=null){
  153. getSnackbar().getView().setBackgroundColor(color_danger);
  154. }
  155. return this;
  156. }
  157. /**
  158. * 设置Snackbar背景色
  159. * @param backgroundColor
  160. */
  161. public SnackbarUtils backColor(@ColorInt int backgroundColor){
  162. if(getSnackbar()!=null){
  163. getSnackbar().getView().setBackgroundColor(backgroundColor);
  164. }
  165. return this;
  166. }
  167. /**
  168. * 设置TextView(@+id/snackbar_text)的文字颜色
  169. * @param messageColor
  170. */
  171. public SnackbarUtils messageColor(@ColorInt int messageColor){
  172. if(getSnackbar()!=null){
  173. ((TextView)getSnackbar().getView().findViewById(R.id.snackbar_text)).setTextColor(messageColor);
  174. }
  175. return this;
  176. }
  177. /**
  178. * 设置Button(@+id/snackbar_action)的文字颜色
  179. * @param actionTextColor
  180. */
  181. public SnackbarUtils actionColor(@ColorInt int actionTextColor){
  182. if(getSnackbar()!=null){
  183. ((Button)getSnackbar().getView().findViewById(R.id.snackbar_action)).setTextColor(actionTextColor);
  184. }
  185. return this;
  186. }
  187. /**
  188. * 设置 Snackbar背景色 + TextView(@+id/snackbar_text)的文字颜色 + Button(@+id/snackbar_action)的文字颜色
  189. * @param backgroundColor
  190. * @param messageColor
  191. * @param actionTextColor
  192. */
  193. public SnackbarUtils colors(@ColorInt int backgroundColor, @ColorInt int messageColor, @ColorInt int actionTextColor){
  194. if(getSnackbar()!=null){
  195. getSnackbar().getView().setBackgroundColor(backgroundColor);
  196. ((TextView)getSnackbar().getView().findViewById(R.id.snackbar_text)).setTextColor(messageColor);
  197. ((Button)getSnackbar().getView().findViewById(R.id.snackbar_action)).setTextColor(actionTextColor);
  198. }
  199. return this;
  200. }
  201. /**
  202. * 设置Snackbar 背景透明度
  203. * @param alpha
  204. * @return
  205. */
  206. public SnackbarUtils alpha(float alpha){
  207. if(getSnackbar()!=null){
  208. alpha = alpha>=1.0f?1.0f:(alpha<=0.0f?0.0f:alpha);
  209. getSnackbar().getView().setAlpha(alpha);
  210. }
  211. return this;
  212. }
  213. /**
  214. * 设置Snackbar显示的位置
  215. * @param gravity
  216. */
  217. public SnackbarUtils gravityFrameLayout(int gravity){
  218. if(getSnackbar()!=null){
  219. FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(getSnackbar().getView().getLayoutParams().width,getSnackbar().getView().getLayoutParams().height);
  220. params.gravity = gravity;
  221. getSnackbar().getView().setLayoutParams(params);
  222. }
  223. return this;
  224. }
  225. /**
  226. * 设置Snackbar显示的位置,当Snackbar和CoordinatorLayout组合使用的时候
  227. * @param gravity
  228. */
  229. public SnackbarUtils gravityCoordinatorLayout(int gravity){
  230. if(getSnackbar()!=null){
  231. CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(getSnackbar().getView().getLayoutParams().width,getSnackbar().getView().getLayoutParams().height);
  232. params.gravity = gravity;
  233. getSnackbar().getView().setLayoutParams(params);
  234. }
  235. return this;
  236. }
  237. /**
  238. * 设置按钮文字内容 及 点击监听
  239. * {@link Snackbar#setAction(CharSequence, View.OnClickListener)}
  240. * @param resId
  241. * @param listener
  242. * @return
  243. */
  244. public SnackbarUtils setAction(@StringRes int resId, View.OnClickListener listener){
  245. if(getSnackbar()!=null){
  246. return setAction(getSnackbar().getView().getResources().getText(resId), listener);
  247. }else {
  248. return this;
  249. }
  250. }
  251. /**
  252. * 设置按钮文字内容 及 点击监听
  253. * {@link Snackbar#setAction(CharSequence, View.OnClickListener)}
  254. * @param text
  255. * @param listener
  256. * @return
  257. */
  258. public SnackbarUtils setAction(CharSequence text, View.OnClickListener listener){
  259. if(getSnackbar()!=null){
  260. getSnackbar().setAction(text,listener);
  261. }
  262. return this;
  263. }
  264. /**
  265. * 设置 mSnackbar 展示完成 及 隐藏完成 的监听
  266. * @param setCallback
  267. * @return
  268. */
  269. public SnackbarUtils setCallback(Snackbar.Callback setCallback){
  270. if(getSnackbar()!=null){
  271. getSnackbar().setCallback(setCallback);
  272. }
  273. return this;
  274. }
  275. /**
  276. * 设置TextView(@+id/snackbar_text)左右两侧的图片
  277. * @param leftDrawable
  278. * @param rightDrawable
  279. * @return
  280. */
  281. public SnackbarUtils leftAndRightDrawable(@Nullable @DrawableRes Integer leftDrawable, @Nullable @DrawableRes Integer rightDrawable){
  282. if(getSnackbar()!=null){
  283. Drawable drawableLeft = null;
  284. Drawable drawableRight = null;
  285. if(leftDrawable!=null){
  286. try {
  287. drawableLeft = getSnackbar().getView().getResources().getDrawable(leftDrawable.intValue());
  288. }catch (Exception e){
  289. }
  290. }
  291. if(rightDrawable!=null){
  292. try {
  293. drawableRight = getSnackbar().getView().getResources().getDrawable(rightDrawable.intValue());
  294. }catch (Exception e){
  295. }
  296. }
  297. return leftAndRightDrawable(drawableLeft,drawableRight);
  298. }else {
  299. return this;
  300. }
  301. }
  302. /**
  303. * 设置TextView(@+id/snackbar_text)左右两侧的图片
  304. * @param leftDrawable
  305. * @param rightDrawable
  306. * @return
  307. */
  308. public SnackbarUtils leftAndRightDrawable(@Nullable Drawable leftDrawable, @Nullable Drawable rightDrawable){
  309. if(getSnackbar()!=null){
  310. TextView message = (TextView) getSnackbar().getView().findViewById(R.id.snackbar_text);
  311. LinearLayout.LayoutParams paramsMessage = (LinearLayout.LayoutParams) message.getLayoutParams();
  312. paramsMessage = new LinearLayout.LayoutParams(paramsMessage.width, paramsMessage.height,0.0f);
  313. message.setLayoutParams(paramsMessage);
  314. message.setCompoundDrawablePadding(message.getPaddingLeft());
  315. int textSize = (int) message.getTextSize();
  316. Log.e("Jet","textSize:"+textSize);
  317. if(leftDrawable!=null){
  318. leftDrawable.setBounds(0,0,textSize,textSize);
  319. }
  320. if(rightDrawable!=null){
  321. rightDrawable.setBounds(0,0,textSize,textSize);
  322. }
  323. message.setCompoundDrawables(leftDrawable,null,rightDrawable,null);
  324. LinearLayout.LayoutParams paramsSpace = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT,1.0f);
  325. ((Snackbar.SnackbarLayout)getSnackbar().getView()).addView(new Space(getSnackbar().getView().getContext()),1,paramsSpace);
  326. }
  327. return this;
  328. }
  329. /**
  330. * 设置TextView(@+id/snackbar_text)中文字的对齐方式 居中
  331. * @return
  332. */
  333. @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
  334. public SnackbarUtils messageCenter(){
  335. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
  336. if(getSnackbar()!=null){
  337. TextView message = (TextView) getSnackbar().getView().findViewById(R.id.snackbar_text);
  338. //View.setTextAlignment需要SDK>=17
  339. message.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
  340. message.setGravity(Gravity.CENTER);
  341. }
  342. }
  343. return this;
  344. }
  345. /**
  346. * 设置TextView(@+id/snackbar_text)中文字的对齐方式 居右
  347. * @return
  348. */
  349. @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
  350. public SnackbarUtils messageRight(){
  351. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
  352. if(getSnackbar()!=null){
  353. TextView message = (TextView) getSnackbar().getView().findViewById(R.id.snackbar_text);
  354. //View.setTextAlignment需要SDK>=17
  355. message.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
  356. message.setGravity(Gravity.CENTER_VERTICAL|Gravity.RIGHT);
  357. }
  358. }
  359. return this;
  360. }
  361. /**
  362. * 向Snackbar布局中添加View(Google不建议,复杂的布局应该使用DialogFragment进行展示)
  363. * @param layoutId 要添加的View的布局文件ID
  364. * @param index
  365. * @return
  366. */
  367. public SnackbarUtils addView(int layoutId, int index) {
  368. if(getSnackbar()!=null){
  369. //加载布局文件新建View
  370. View addView = LayoutInflater.from(getSnackbar().getView().getContext()).inflate(layoutId,null);
  371. return addView(addView,index);
  372. }else {
  373. return this;
  374. }
  375. }
  376. /**
  377. * 向Snackbar布局中添加View(Google不建议,复杂的布局应该使用DialogFragment进行展示)
  378. * @param addView
  379. * @param index
  380. * @return
  381. */
  382. public SnackbarUtils addView(View addView, int index) {
  383. if(getSnackbar()!=null){
  384. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);//设置新建布局参数
  385. //设置新建View在Snackbar内垂直居中显示
  386. params.gravity= Gravity.CENTER_VERTICAL;
  387. addView.setLayoutParams(params);
  388. ((Snackbar.SnackbarLayout)getSnackbar().getView()).addView(addView,index);
  389. }
  390. return this;
  391. }
  392. /**
  393. * 设置Snackbar布局的外边距
  394. * 注:经试验发现,调用margins后再调用 gravityFrameLayout,则margins无效.
  395. * 为保证margins有效,应该先调用 gravityFrameLayout,在 show() 之前调用 margins
  396. * @param margin
  397. * @return
  398. */
  399. public SnackbarUtils margins(int margin){
  400. if(getSnackbar()!=null){
  401. return margins(margin,margin,margin,margin);
  402. }else {
  403. return this;
  404. }
  405. }
  406. /**
  407. * 设置Snackbar布局的外边距
  408. * 注:经试验发现,调用margins后再调用 gravityFrameLayout,则margins无效.
  409. * 为保证margins有效,应该先调用 gravityFrameLayout,在 show() 之前调用 margins
  410. * @param left
  411. * @param top
  412. * @param right
  413. * @param bottom
  414. * @return
  415. */
  416. public SnackbarUtils margins(int left, int top, int right, int bottom){
  417. if(getSnackbar()!=null){
  418. ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
  419. ((ViewGroup.MarginLayoutParams) params).setMargins(left,top,right,bottom);
  420. getSnackbar().getView().setLayoutParams(params);
  421. }
  422. return this;
  423. }
  424. /**
  425. * 经试验发现:
  426. * 执行过{@link SnackbarUtils#backColor(int)}后:background instanceof ColorDrawable
  427. * 未执行过{@link SnackbarUtils#backColor(int)}:background instanceof GradientDrawable
  428. * @return
  429. */
  430. /*
  431. public SnackbarUtils radius(){
  432. Drawable background = snackbarWeakReference.get().getView().getBackground();
  433. if(background instanceof GradientDrawable){
  434. Log.e("Jet","radius():GradientDrawable");
  435. }
  436. if(background instanceof ColorDrawable){
  437. Log.e("Jet","radius():ColorDrawable");
  438. }
  439. if(background instanceof StateListDrawable){
  440. Log.e("Jet","radius():StateListDrawable");
  441. }
  442. Log.e("Jet","radius()background:"+background.getClass().getSimpleName());
  443. return new SnackbarUtils(mSnackbar);
  444. }
  445. */
  446. /**
  447. * 通过SnackBar现在的背景,获取其设置圆角值时候所需的GradientDrawable实例
  448. * @param backgroundOri
  449. * @return
  450. */
  451. private GradientDrawable getRadiusDrawable(Drawable backgroundOri){
  452. GradientDrawable background = null;
  453. if(backgroundOri instanceof GradientDrawable){
  454. background = (GradientDrawable) backgroundOri;
  455. }else if(backgroundOri instanceof ColorDrawable){
  456. int backgroundColor = ((ColorDrawable)backgroundOri).getColor();
  457. background = new GradientDrawable();
  458. background.setColor(backgroundColor);
  459. }else {
  460. }
  461. return background;
  462. }
  463. /**
  464. * 设置Snackbar布局的圆角半径值
  465. * @param radius 圆角半径
  466. * @return
  467. */
  468. public SnackbarUtils radius(float radius){
  469. if(getSnackbar()!=null){
  470. //将要设置给mSnackbar的背景
  471. GradientDrawable background = getRadiusDrawable(getSnackbar().getView().getBackground());
  472. if(background != null){
  473. radius = radius<=0?12:radius;
  474. background.setCornerRadius(radius);
  475. getSnackbar().getView().setBackgroundDrawable(background);
  476. }
  477. }
  478. return this;
  479. }
  480. /**
  481. * 设置Snackbar布局的圆角半径值及边框颜色及边框宽度
  482. * @param radius
  483. * @param strokeWidth
  484. * @param strokeColor
  485. * @return
  486. */
  487. public SnackbarUtils radius(int radius, int strokeWidth, @ColorInt int strokeColor){
  488. if(getSnackbar()!=null){
  489. //将要设置给mSnackbar的背景
  490. GradientDrawable background = getRadiusDrawable(getSnackbar().getView().getBackground());
  491. if(background != null){
  492. radius = radius<=0?12:radius;
  493. strokeWidth = strokeWidth<=0?1:(strokeWidth>=getSnackbar().getView().findViewById(R.id.snackbar_text).getPaddingTop()?2:strokeWidth);
  494. background.setCornerRadius(radius);
  495. background.setStroke(strokeWidth,strokeColor);
  496. getSnackbar().getView().setBackgroundDrawable(background);
  497. }
  498. }
  499. return this;
  500. }
  501. /**
  502. * 计算单行的Snackbar的高度值(单位 pix)
  503. * @return
  504. */
  505. private int calculateSnackBarHeight(){
  506. /*
  507. <TextView
  508. android:id="@+id/snackbar_text"
  509. android:layout_width="wrap_content"
  510. android:layout_height="wrap_content"
  511. android:layout_weight="1"
  512. android:paddingTop="@dimen/design_snackbar_padding_vertical"
  513. android:paddingBottom="@dimen/design_snackbar_padding_vertical"
  514. android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
  515. android:paddingRight="@dimen/design_snackbar_padding_horizontal"
  516. android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
  517. android:maxLines="@integer/design_snackbar_text_max_lines"
  518. android:layout_gravity="center_vertical|left|start"
  519. android:ellipsize="end"
  520. android:textAlignment="viewStart"/>
  521. */
  522. //文字高度+paddingTop+paddingBottom : 14sp + 14dp*2
  523. int SnackbarHeight = ScreenUtil.dp2px(getSnackbar().getView().getContext(),28) + ScreenUtil.sp2px(getSnackbar().getView().getContext(),14);
  524. Log.e("Jet","直接获取MessageView高度:"+getSnackbar().getView().findViewById(R.id.snackbar_text).getHeight());
  525. return SnackbarHeight;
  526. }
  527. /**
  528. * 设置Snackbar显示在指定View的上方
  529. * 注:暂时仅支持单行的Snackbar,因为{@link SnackbarUtils#calculateSnackBarHeight()}暂时仅支持单行Snackbar的高度计算
  530. * @param targetView 指定View
  531. * @param contentViewTop Activity中的View布局区域 距离屏幕顶端的距离
  532. * @param marginLeft 左边距
  533. * @param marginRight 右边距
  534. * @return
  535. */
  536. public SnackbarUtils above(View targetView, int contentViewTop, int marginLeft, int marginRight){
  537. if(getSnackbar()!=null){
  538. marginLeft = marginLeft<=0?0:marginLeft;
  539. marginRight = marginRight<=0?0:marginRight;
  540. int[] locations = new int[2];
  541. targetView.getLocationOnScreen(locations);
  542. Log.e("Jet","距离屏幕左侧:"+locations[0]+"==距离屏幕顶部:"+locations[1]);
  543. int snackbarHeight = calculateSnackBarHeight();
  544. Log.e("Jet","Snackbar高度:"+snackbarHeight);
  545. //必须保证指定View的顶部可见 且 单行Snackbar可以完整的展示
  546. if(locations[1] >= contentViewTop+snackbarHeight){
  547. gravityFrameLayout(Gravity.BOTTOM);
  548. ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
  549. ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,getSnackbar().getView().getResources().getDisplayMetrics().heightPixels-locations[1]);
  550. getSnackbar().getView().setLayoutParams(params);
  551. }
  552. }
  553. return this;
  554. }
  555. //CoordinatorLayout
  556. public SnackbarUtils aboveCoordinatorLayout(View targetView, int contentViewTop, int marginLeft, int marginRight){
  557. if(getSnackbar()!=null){
  558. marginLeft = marginLeft<=0?0:marginLeft;
  559. marginRight = marginRight<=0?0:marginRight;
  560. int[] locations = new int[2];
  561. targetView.getLocationOnScreen(locations);
  562. Log.e("Jet","距离屏幕左侧:"+locations[0]+"==距离屏幕顶部:"+locations[1]);
  563. int snackbarHeight = calculateSnackBarHeight();
  564. Log.e("Jet","Snackbar高度:"+snackbarHeight);
  565. //必须保证指定View的顶部可见 且 单行Snackbar可以完整的展示
  566. if(locations[1] >= contentViewTop+snackbarHeight){
  567. gravityCoordinatorLayout(Gravity.BOTTOM);
  568. ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
  569. ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,getSnackbar().getView().getResources().getDisplayMetrics().heightPixels-locations[1]);
  570. getSnackbar().getView().setLayoutParams(params);
  571. }
  572. }
  573. return this;
  574. }
  575. /**
  576. * 设置Snackbar显示在指定View的下方
  577. * 注:暂时仅支持单行的Snackbar,因为{@link SnackbarUtils#calculateSnackBarHeight()}暂时仅支持单行Snackbar的高度计算
  578. * @param targetView 指定View
  579. * @param contentViewTop Activity中的View布局区域 距离屏幕顶端的距离
  580. * @param marginLeft 左边距
  581. * @param marginRight 右边距
  582. * @return
  583. */
  584. public SnackbarUtils bellow(View targetView, int contentViewTop, int marginLeft, int marginRight){
  585. if(getSnackbar()!=null){
  586. marginLeft = marginLeft<=0?0:marginLeft;
  587. marginRight = marginRight<=0?0:marginRight;
  588. int[] locations = new int[2];
  589. targetView.getLocationOnScreen(locations);
  590. int snackbarHeight = calculateSnackBarHeight();
  591. int screenHeight = ScreenUtil.getScreenHeight(getSnackbar().getView().getContext());
  592. //必须保证指定View的底部可见 且 单行Snackbar可以完整的展示
  593. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
  594. //为什么要'+2'? 因为在Android L(Build.VERSION_CODES.LOLLIPOP)以上,例如Button会有一定的'阴影(shadow)',阴影的大小由'高度(elevation)'决定.
  595. //为了在Android L以上的系统中展示的Snackbar不要覆盖targetView的阴影部分太大比例,所以人为减小2px的layout_marginBottom属性.
  596. if(locations[1]+targetView.getHeight()>=contentViewTop&&locations[1]+targetView.getHeight()+snackbarHeight+2<=screenHeight){
  597. gravityFrameLayout(Gravity.BOTTOM);
  598. ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
  599. ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,screenHeight - (locations[1]+targetView.getHeight()+snackbarHeight+2));
  600. getSnackbar().getView().setLayoutParams(params);
  601. }
  602. }else {
  603. if(locations[1]+targetView.getHeight()>=contentViewTop&&locations[1]+targetView.getHeight()+snackbarHeight<=screenHeight){
  604. gravityFrameLayout(Gravity.BOTTOM);
  605. ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
  606. ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,screenHeight - (locations[1]+targetView.getHeight()+snackbarHeight));
  607. getSnackbar().getView().setLayoutParams(params);
  608. }
  609. }
  610. }
  611. return this;
  612. }
  613. public SnackbarUtils bellowCoordinatorLayout(View targetView, int contentViewTop, int marginLeft, int marginRight){
  614. if(getSnackbar()!=null){
  615. marginLeft = marginLeft<=0?0:marginLeft;
  616. marginRight = marginRight<=0?0:marginRight;
  617. int[] locations = new int[2];
  618. targetView.getLocationOnScreen(locations);
  619. int snackbarHeight = calculateSnackBarHeight();
  620. int screenHeight = ScreenUtil.getScreenHeight(getSnackbar().getView().getContext());
  621. //必须保证指定View的底部可见 且 单行Snackbar可以完整的展示
  622. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
  623. //为什么要'+2'? 因为在Android L(Build.VERSION_CODES.LOLLIPOP)以上,例如Button会有一定的'阴影(shadow)',阴影的大小由'高度(elevation)'决定.
  624. //为了在Android L以上的系统中展示的Snackbar不要覆盖targetView的阴影部分太大比例,所以人为减小2px的layout_marginBottom属性.
  625. if(locations[1]+targetView.getHeight()>=contentViewTop&&locations[1]+targetView.getHeight()+snackbarHeight+2<=screenHeight){
  626. gravityCoordinatorLayout(Gravity.BOTTOM);
  627. ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
  628. ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,screenHeight - (locations[1]+targetView.getHeight()+snackbarHeight+2));
  629. getSnackbar().getView().setLayoutParams(params);
  630. }
  631. }else {
  632. if(locations[1]+targetView.getHeight()>=contentViewTop&&locations[1]+targetView.getHeight()+snackbarHeight<=screenHeight){
  633. gravityCoordinatorLayout(Gravity.BOTTOM);
  634. ViewGroup.LayoutParams params = getSnackbar().getView().getLayoutParams();
  635. ((ViewGroup.MarginLayoutParams) params).setMargins(marginLeft,0,marginRight,screenHeight - (locations[1]+targetView.getHeight()+snackbarHeight));
  636. getSnackbar().getView().setLayoutParams(params);
  637. }
  638. }
  639. }
  640. return this;
  641. }
  642. /**
  643. * 显示 mSnackbar
  644. */
  645. public void show(){
  646. Log.e("Jet","show()");
  647. if(getSnackbar()!=null){
  648. Log.e("Jet","show");
  649. getSnackbar().show();
  650. }else {
  651. Log.e("Jet","已经被回收");
  652. }
  653. }
  654. }