пятница, 4 октября 2013 г.

Создаём свои всплыващие сообщения в Android

Если вы хотите реализовать свои собственные всплывающие сообщения, которыми можно управлять, то этот пост точно для вас! Вы спросите, а почему не взять уже готовую реализацию Toast, и все дела?  Ответ следующий, да спору нет в эффективности этого класса, но я столкнулся с тем, что мне нужны были такие всплывающие сообщения, для которых можно было бы установить, время жизни, анимацию или например обработать событие по нажатию кнопки, которая размещена в вашем контенте. Вот для этих целей, был и создан класс, который может выполнить все перечисленные возможности в отличии о Toast.

Для того чтобы можно было начать работать с данным классом, вам нужно выполнить следующее:

I. Создаём layout файл notify.xml, это будет содержимым, для наших всплывающих сообщений:
<?xml version="1.0" encoding="utf-8"?>
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/content"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:background="@drawable/notify_content"
              android:visibility="invisible">
 
    <TextView android:id="@+id/message"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:ellipsize="marquee"
              android:marqueeRepeatLimit="marquee_forever"
              android:scrollHorizontally="true"
              android:singleLine="true"
              android:textColor="#fffefe"/>
 
</LinearLayout>
II. Создаём файлы fade_in и fade_out для нашей анимации:
res/anim/fade_in

<?xml version="1.0" encoding="utf-8"?>
 
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:fillAfter="true">
 
    <alpha android:duration="1000"
           android:fromAlpha="0.0"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:toAlpha="1.0"/>
 
</set>
res/anim/fade_out
<?xml version="1.0" encoding="utf-8"?>
 
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:fillAfter="true">
 
    <alpha android:duration="1000"
           android:fromAlpha="1.0"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:toAlpha="0.0"/>
 
</set>
III. Создаём класс Notify, который и будет отвечать за наши всплывающие сообщения:

public class Notify {
    private Context context;
    private View view;
    private Handler handler = new Handler ();
 
    /**
     *
     * @param context
     */
 
    public Notify(Context context) {
        this.context = context;
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams ();
        layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
        layoutParams.format = PixelFormat.TRANSLUCENT;
        layoutParams.type = WindowManager.LayoutParams.TYPE_TOAST;
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
        view = layoutInflater.inflate (R.layout.notify, null);
        TextView notifyMessage = (TextView) view.findViewById (R.id.message);
        notifyMessage.setSelected (true);
        ViewGroup viewGroup = new FrameLayout(context);
        WindowManager mWindowManager = (WindowManager) context.getSystemService (Context.WINDOW_SERVICE);
        mWindowManager.addView (viewGroup, layoutParams);
        viewGroup.addView (view);
    }
 
    /**
     *
     * @param animation
     * @param resIdMessage
     * @param delayMillis
     */
 
    public void show (boolean animation, int resIdMessage, long delayMillis) {
        show (animation, context.getText(resIdMessage), delayMillis);
    }
 
    /**
     *
     * @param animation
     * @param message
     * @param delayMillis
     */
 
    public void show (boolean animation, CharSequence message, long delayMillis) {
        handler.removeCallbacks(runnable);
 
        if (delayMillis > 0) {
            handler.postDelayed (runnable, delayMillis);
        }
 
        ((TextView) view.findViewById (R.id.message)).setText(message);
 
        if (animation) {
            view.startAnimation (AnimationUtils.loadAnimation (context, R.anim.fade_in));
        }
 
    }
 
    /**
     *
     */
 
    public void hide (boolean animation) {
        handler.removeCallbacks (runnable);
 
        if (animation) {
            view.startAnimation (AnimationUtils.loadAnimation (context, R.anim.fade_out));
        } else {
            view.clearAnimation();
        }
 
    }
 
    /**
     *
     */
 
    private Runnable runnable = new Runnable () {
 
        /**
         *
         */
 
        @Override
        public void run () {
            hide (true);
        }
 
    };
 
}
Теперь можем в нашем Application определить как для примера, следующий метод и вызвать его:
public class App extends Application {
    private static Notify notify;
 
    /**
     *
     */
 
    @Override
    public void onCreate () {
        super.onCreate ();
 
        notify = new Notify (this);
    }
 
    /**
     *
     * @return
     */
 
    public static Notify getNotify () {
        return notify;
    }
 
}

3 комментария:

  1. Только надо добавить r.anim.fade_in и r.anim.fade_out. В посте про это не написано.

    ОтветитьУдалить
  2. Betway: Online Casino, Poker, Bingo - Kardangpintar
    Betway is the one of the largest online casinos in 인카지노 India. Established kadangpintar in 2012 and the world's largest online casino, 메리트 카지노 주소 you can find a wide selection of

    ОтветитьУдалить