中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中怎么利用Application級別自定義Toast

發布時間:2021-06-11 14:45:12 來源:億速云 閱讀:242 作者:Leah 欄目:移動開發

Android中怎么利用Application級別自定義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());
  }
}

看完上述內容,你們掌握Android中怎么利用Application級別自定義Toast的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁乡县| 郧西县| 于田县| 廉江市| 金门县| 伊春市| 镇雄县| 方正县| 尚志市| 梅河口市| 开鲁县| 吴江市| 耒阳市| 星子县| 黎川县| 应用必备| 南丰县| 陆河县| 霍林郭勒市| 犍为县| 唐海县| 应用必备| 双江| 万源市| 巴东县| 桦甸市| 宜昌市| 大兴区| 洞头县| 冕宁县| 临洮县| 诏安县| 汉川市| 枣庄市| 南雄市| 清新县| 兴山县| 农安县| 迁西县| 伊宁市| 万盛区|