最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Application級別自定義Toast

 更新時(shí)間:2018年08月28日 10:30:37   作者:絡(luò)雨涼  
這篇文章主要為大家詳細(xì)介紹了Android Application級別自定義Toast,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

先看效果:

效果很簡單,就是一個(gè)頭部即現(xiàn)即隱的提示,外加過渡動畫。其實(shí)自定義系統(tǒng)級的toast也能實(shí)現(xiàn)這種效果,但之前已經(jīng)說了系統(tǒng)級的toast有限制。

話不多說,現(xiàn)在介紹下這是如何實(shí)現(xiàn)的吧!

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

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

先實(shí)現(xiàn)java類代碼(個(gè)人愛好,喜歡先主后次):

/**
 * 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);
 
    // 結(jié)束動畫
    endAnimation = new AlphaAnimation(1, 0);
    endAnimation.setDuration(500);
    endAnimation.setInterpolator(new AccelerateInterpolator());
 
    // 結(jié)束動畫監(jiān)聽
    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);
    }
  }
 
  /**
   * 結(jié)束
   */
  private void end()
  {
    content.startAnimation(endAnimation);
    isShow = false;
  }
}

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

關(guān)于其中用到的一個(gè)延時(shí)器類DelayTask,這是本人為了方便自行設(shè)計(jì)的一個(gè)工具類,其效果就是延時(shí)執(zhí)行一段UI邏輯,其代碼如下:

/**
 * 延時(shí)器類
 *
 * @author zls
 *
 * @version 1.0
 *
 * @time 2015-12-27下午7:52:10
 */
public abstract class DelayTask
{
 protected Thread thread;
 private boolean isRun;
 
 /**
 * 延時(shí)器
 */
 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();
 }
 };
 
 /** 開始執(zhí)行 */
 public void start()
 {
 isRun = true;
 thread.start();
 }
 
 /** 停止執(zhí)行 */
 public void stop()
 {
 isRun = false;
 }
 
 /** 執(zhí)行邏輯 */
 public abstract void logic();
}

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

現(xiàn)在上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="默認(rèn)提示"
      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下載

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • android之datepicker控件的用法

    android之datepicker控件的用法

    下面小編就為大家?guī)硪黄猘ndroid之datepicker控件的用法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • Retrofit自定義請求參數(shù)注解的實(shí)現(xiàn)思路

    Retrofit自定義請求參數(shù)注解的實(shí)現(xiàn)思路

    這篇文章主要給大家介紹了Retrofit自定義請求參數(shù)注解的實(shí)現(xiàn)思路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • android 監(jiān)聽SD卡文件變化的實(shí)現(xiàn)代碼

    android 監(jiān)聽SD卡文件變化的實(shí)現(xiàn)代碼

    這篇文章主要介紹了android 監(jiān)聽SD卡文件變化的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-11-11
  • Android自定義TextBanner實(shí)現(xiàn)自動滾動

    Android自定義TextBanner實(shí)現(xiàn)自動滾動

    這篇文章主要為大家詳細(xì)介紹了Android自定義TextBanner實(shí)現(xiàn)自動滾動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Android實(shí)現(xiàn)滑動刻度尺效果

    Android實(shí)現(xiàn)滑動刻度尺效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)滑動刻度尺效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 解決android studio 打包發(fā)現(xiàn)generate signed apk 消失不見問題

    解決android studio 打包發(fā)現(xiàn)generate signed apk 消失不見問題

    這篇文章主要介紹了解決android studio 打包發(fā)現(xiàn)generate signed apk 消失不見問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Android操作SQLite基本用法

    Android操作SQLite基本用法

    這篇文章主要介紹了Android操作SQLite基本用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-12-12
  • Android app會crash的原因及解決方法

    Android app會crash的原因及解決方法

    這篇文章主要介紹了Android app會crash的原因及解決方法,幫助大家更好的進(jìn)行Android開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • Android開發(fā)之圖形圖像與動畫(四)AnimationListener簡介

    Android開發(fā)之圖形圖像與動畫(四)AnimationListener簡介

    就像Button控件有監(jiān)聽器一樣,動畫效果也有監(jiān)聽器,只需要實(shí)現(xiàn)AnimationListener就可以實(shí)現(xiàn)對動畫效果的監(jiān)聽,感興趣的朋友可以了解下啊,希望本文對你有所幫助
    2013-01-01
  • Android使用ScrollView實(shí)現(xiàn)滾動效果

    Android使用ScrollView實(shí)現(xiàn)滾動效果

    這篇文章主要為大家詳細(xì)介紹了Android使用ScrollView實(shí)現(xiàn)滾動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01

最新評論

吉木萨尔县| 米泉市| 兴安县| 云和县| 青海省| 肥乡县| 磐石市| 盐津县| 略阳县| 蕲春县| 云安县| 栖霞市| 如东县| 石首市| 青州市| 霍林郭勒市| 凌云县| 阳信县| 长海县| 张掖市| 商洛市| 确山县| 齐河县| 化州市| 法库县| 南开区| 云龙县| 禹城市| 临清市| 德庆县| 岐山县| 阳高县| 海门市| 利津县| 水城县| 克山县| 潜江市| 九江县| 葵青区| 墨江| 苏尼特左旗|