国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Application級別自定義Toast

2019-10-21 21:39:53
字體:
來源:轉載
供稿:網友

Android開發過程中,有時會需要一些消息提示,大多數情況可以用dialog來做,但有些消息不需要用戶去點擊取消并且不能對用戶體驗產生影響的提示,就需要toast來做了。但可惜的是,toast是系統級的,凡是涉及到系統的又會涉及到其他APP,有些定制系統可以對App的消息通知進行設置,一旦禁止了APP的通知toast則不會顯示。而且在Android 7以后toast還需要申請權限麻煩死了有木有,勞資就想安安靜靜的提示一下有這么麻煩嗎!所以,本人特地研究了下能在Application級別不受限制提示的toast。

先看效果:

Android,Application,Toast

效果很簡單,就是一個頭部即現即隱的提示,外加過渡動畫。其實自定義系統級的toast也能實現這種效果,但之前已經說了系統級的toast有限制。

話不多說,現在介紹下這是如何實現的吧!

首先申明這是基于WindowManager產生的view,本人看了系統級toast的源碼好像也是基于WindowManager的。WindowManager是個神奇的東西,在這就不多做介紹了,我們只需要知道activity.getWindowManager().addView(layout, params)可以給整個Activity界面添加一個view層,這一層可以不影響activity的操作。竟然有這個功能瞬間漲姿勢了有不有!細心人的應該察覺到了這和FrameLayout挺像,其實Activity的root就是一個FrameLayout。

好了,既然Activity有這個功能,那tosat做起來就有頭緒了。

先實現java類代碼(個人愛好,喜歡先主后次):

/** * App級toast */public class AppToast{  private Activity activity;   private ViewGroup layout;  private ViewGroup content;  private TextView textView;   private Animation startAnimation;  private Animation centerAnimation;  private Animation endAnimation;   private DelayTask task;  private boolean isShow;   private LayoutParams params;   /**   * APP級別Toast   */  public AppToast(Activity activity)  {    this.activity = activity;     layout = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.toast, null);    content = (ViewGroup) layout.getChildAt(0);    textView = (TextView) content.getChildAt(0);    params = new LayoutParams();    params.height = LayoutParams.WRAP_CONTENT;    params.width = LayoutParams.MATCH_PARENT;    params.gravity = Gravity.TOP;    params.type = LayoutParams.TYPE_APPLICATION;    params.format = PixelFormat.TRANSLUCENT;    params.flags = LayoutParams.FLAG_KEEP_SCREEN_ON | LayoutParams.FLAG_NOT_FOCUSABLE |        LayoutParams.FLAG_NOT_TOUCHABLE;    activity.getWindowManager().addView(layout, params);    layout.setVisibility(View.GONE);     // 開始動畫    startAnimation = new AlphaAnimation(0, 1);    startAnimation.setDuration(500);     // 中間動畫    centerAnimation = new AlphaAnimation(0.92f, 1);    centerAnimation.setDuration(500);     // 結束動畫    endAnimation = new AlphaAnimation(1, 0);    endAnimation.setDuration(500);    endAnimation.setInterpolator(new AccelerateInterpolator());     // 結束動畫監聽    endAnimation.setAnimationListener(new Animation.AnimationListener()    {      @Override      public void onAnimationStart(Animation animation)      {      }       @Override      public void onAnimationEnd(Animation animation)      {        layout.setVisibility(View.GONE);      }       @Override      public void onAnimationRepeat(Animation animation)      {      }    });  }   /**   * 顯示Toast   */  public void show(String s)  {    show(s, 1500);  }   /**   * 顯示Toast   */  public void show(String s, int delay)  {    textView.setText(s);    start();    if (task != null)    {      task.stop();    }    task = new DelayTask(delay)    {      @Override      public void logic()      {        end();      }    };    task.start();  }   /**   * 開始   */  private void start()  {    if (!isShow)    {      layout.setVisibility(View.VISIBLE);      content.startAnimation(startAnimation);      isShow = true;    } else    {      content.startAnimation(centerAnimation);    }  }   /**   * 結束   */  private void end()  {    content.startAnimation(endAnimation);    isShow = false;  }}

先在構造方法AppToast(Activity activity)中加載自定義toast的布局以及初始化params參數。然后添加各個過程所需的動畫。這其中有個重點,就是params.type = LayoutParams.TYPE_APPLICATION,記住一定要是TYPE_APPLICATION,而不是TYPE_TOAST,TYPE_TOAST會在Android 7上被莫名其妙的限制。
有些人可能會注意到除了開始動畫和結束動畫,為什么還有個中間動畫?其實這是為了多重toast提示做的一個辨別機制,我們在用系統級toast的時候有些人應該能感受到toast并不是重疊顯示,但也不是直接替換內容,而是在替換內容的時候微微的閃一下表示內容變更了,所以在這里就用了一個中間動畫來執行那“閃一下”的效果。

關于其中用到的一個延時器類DelayTask,這是本人為了方便自行設計的一個工具類,其效果就是延時執行一段UI邏輯,其代碼如下:

/** * 延時器類 * * @author zls * * @version 1.0 * * @time 2015-12-27下午7:52:10 */public abstract class DelayTask{ protected Thread thread; private boolean isRun;  /** * 延時器 */ public DelayTask(final long delay) { thread = new Thread() {  @Override  public void run()  {  try  {   sleep(delay);   if(isRun)   {   mHandler.sendEmptyMessage(0);   }  } catch (Exception e)  {  }  } }; }  protected Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) {  logic(); } };  /** 開始執行 */ public void start() { isRun = true; thread.start(); }  /** 停止執行 */ public void stop() { isRun = false; }  /** 執行邏輯 */ public abstract void logic();}

有興趣的朋友可以借鑒下,覺得這么設計不太好的也可以用你們自己設計的延時器來用。

現在上toast的布局代碼:

<?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:paddingTop="5dp"  android:paddingLeft="15dp"  android:paddingRight="15dp">   <LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:background="@drawable/toast_shape"    android:fitsSystemWindows="true"    android:orientation="vertical">     <TextView      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:layout_margin="20dp"      android:gravity="center"      android:text="默認提示"      android:textColor="#fff"      android:textSize="15sp"/>  </LinearLayout> </LinearLayout>

測試Activity的代碼:

public class MainActivity extends AppCompatActivity{  private AppToast toast;   @Override  protected void onCreate(Bundle savedInstanceState)  {    super.onCreate(savedInstanceState);    setContentView(R.layout.main_activity);     toast = new AppToast(this);  }   public void ok(View v)  {    toast.show("這是Toast測試!" + Math.random());  }}

Demo下載

就此結束,希望能幫到需要此功能的朋友。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙陵县| 德安县| 宜兰县| 绩溪县| 察哈| 宾阳县| 临城县| 上虞市| 田东县| 普安县| 五大连池市| 长沙县| 昌黎县| 辽源市| 余姚市| 拜泉县| 台山市| 德格县| 葫芦岛市| 贵溪市| 台北县| 民县| 杭锦旗| 北辰区| 丰城市| 类乌齐县| 乌审旗| 龙口市| 嘉兴市| 水城县| 东港市| 安陆市| 石柱| 涿鹿县| 彭山县| 醴陵市| 大理市| 涟源市| 广西| 旌德县| 华宁县|