Android 애플 리 케 이 션 등급 사용자 정의 토스트

안 드 로 이 드 개발 과정 에서 메시지 알림 이 필요 할 때 가 있 습 니 다.대부분의 경우 dialog 로 할 수 있 습 니 다.그러나 일부 메 시 지 는 사용자 가 취 소 를 클릭 하지 않 아 도 되 고 사용자 체험 에 영향 을 미 치지 못 하 는 알림 이 있 으 면 toast 가 해 야 합 니 다.그러나 안 타 깝 게 도 toast 는 시스템 급 이 고 시스템 과 관련 된 것 은 다른 앱 과 관련 될 수 있 으 며 일부 맞 춤 형 시스템 은 앱 의 메시지 알림 을 설정 할 수 있 으 며 앱 의 알림 toast 가 금지 되면 표시 되 지 않 습 니 다.그리고 안 드 로 이 드 7 이후 toast 는 신청 권한 이 필요 합 니 다.귀찮아 죽 겠 습 니 다.노 사 는 조용히 힌트 를 주 고 싶 습 니 다.이렇게 귀 찮 습 니까?그래서 저 는 애플 리 케 이 션 등급 에서 제한 없 이 제시 할 수 있 는 toast 를 특별히 연 구 했 습 니 다.
먼저 효과 보기:

효 과 는 매우 간단 하 다.바로 머리 가 나타 나 면 숨 어 있 는 힌트 이 고 과도 애니메이션 이다.사실 사용자 정의 시스템 급 toast 도 이런 효 과 를 실현 할 수 있 지만 이미 시스템 급 toast 에 제한 이 있다 고 말 했다.
말 이 많 지 않 으 니 어떻게 이 루어 졌 는 지 소개 해 주세요!
우선 이것 은 Window Manager 를 기반 으로 한 view 라 고 밝 혔 습 니 다.본인 이 시스템 급 toast 의 소스 코드 를 본 것 도 Window Manager 를 기반 으로 한 것 같 습 니 다.Window Manager 는 신기 한 것 입 니 다.여기 서 더 이상 소개 하지 않 겠 습 니 다.activity.getWindow Manager().addView(layot,params)는 전체 Activity 인터페이스 에 view 층 을 추가 할 수 있 습 니 다.이 층 은 activity 의 작업 에 영향 을 주지 않 습 니 다.이 기능 이 있다 니.순간 자세 가 올 라 갔 어 요.있어 요,없어 요!세심 한 사람 은 FrameLayout 와 비슷 하 다 는 것 을 알 아 차 렸 을 것 이다.사실 Activity 의 root 는 FrameLayout 이다.
자,Activity 에 이런 기능 이 있 으 니 tosat 는 해 보면 실마리 가 잡 힐 것 이다.
먼저 자바 류 코드 를 실현 합 니 다.

/**
 * 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=Layout Params.TYPE응용 프로그램,반드시 TYPETYPE 가 아 닌 애플 리 케 이 션TOAST,TYPE_TOAST 는 안 드 로 이 드 7 에서 알 수 없 는 제약 을 받는다.
어떤 사람들 은 애니메이션 을 시작 하고 애니메이션 을 끝 내 는 것 외 에 왜 중간 애니메이션 이 있 는 지 알 수 있 습 니 다.사실은 이것 은 다 중 toast 알림 을 위 한 판별 메커니즘 입 니 다.우 리 는 시스템 급 toast 를 사용 할 때 어떤 사람들 은 toast 가 겹 쳐 서 표시 되 는 것 이 아니 라 내용 을 직접 교체 하 는 것 이 아니 라 내용 을 교체 할 때 약간 반 짝 거 려 서 내용 이 변경 되 었 다 는 것 을 느 낄 수 있 습 니 다.그래서 여기 서 중간 애니메이션 으로 그'반 짝 이'효 과 를 실 행 했 습 니 다.
그 중에서 사용 하 는 지연 기 류 Delay Task 에 대해 이것 은 본인 이 편리 하 게 자체 적 으로 디자인 한 도구 류 입 니 다.그 효 과 는 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 다운로드 하 다.
여기 서 끝나 고 이 기능 이 필요 한 친구 에 게 도움 이 됐 으 면 좋 겠 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기