Android自定义toast - 飞天小鳄 - 博客园

来源: Android自定义toast – 飞天小鳄 – 博客园

在开发Android应用时,一般我们都会用toast来弹出提示消息,简单高 效。但是在不同的手机下toast显示的位置和样式可能会不同,而且系统自带的toast样式奇丑(个人觉得…),那么怎样定制一个个性的toast 提示框呢。。。  今天我就分享一下自己写的自定义toast,不足之处还请大家多多指点。(后边有效果图)

 

1、因为toast的特性,所以我们定义toast为单例模式。

<span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">><span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_copy"</span><span class="tag">><a</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"复制代码"</span><span class="tag">><img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"http://www.mikel.cn/wp-content/uploads/2015/05/copycode4.gif"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"复制代码"</span><span class="pln"> </span><span class="tag">/></a></span></div></span><span class="pln">
</span><span class="tag"><pre></span><span class="pln">private static ZToast instance; //单例的
    private View mToastView;//自定义toast view
    private TextView mTextView;
    private Boolean mIsShow;//记录状态 是否在显示
    private Timer mTimer;//定时器
 
 
    public synchronized static ZToast getInstance(Context context) {
        if (instance == null)
            instance = new ZToast(context);
        return instance;
    }   
 
    private ZToast(Context context) {
        mIsShow = false;// 记录当前Toast的内容是否已经在显示
 
     //这里初始化toast view
        mToastView = LayoutInflater.from(context).inflate(R.layout.common_toast, null);
                 
     //用来提示的文字
        mTextView = ((TextView) mToastView.findViewById(R.id.toast_text));
 
     //初始化计数器
        mTimer = new Timer();
        // 设置布局参数
        setParams();
    }        </span>

2、接着设置布局样式:

<span class="pln">    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">LayoutParams</span><span class="pln"> mParams</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setParams</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        mParams </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">WindowManager</span><span class="pun">.</span><span class="typ">LayoutParams</span><span class="pun">();</span><span class="com">//初始化</span><span class="pln">
        mParams</span><span class="pun">.</span><span class="pln">height </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WindowManager</span><span class="pun">.</span><span class="typ">LayoutParams</span><span class="pun">.</span><span class="pln">WRAP_CONTENT</span><span class="pun">;</span><span class="pln">  </span><span class="com">//高</span><span class="pln">
        mParams</span><span class="pun">.</span><span class="pln">width </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WindowManager</span><span class="pun">.</span><span class="typ">LayoutParams</span><span class="pun">.</span><span class="pln">WRAP_CONTENT</span><span class="pun">;</span><span class="pln">   </span><span class="com">//宽</span><span class="pln">
        mParams</span><span class="pun">.</span><span class="pln">format </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PixelFormat</span><span class="pun">.</span><span class="pln">TRANSLUCENT</span><span class="pun">;</span><span class="pln">               
        mParams</span><span class="pun">.</span><span class="pln">windowAnimations </span><span class="pun">=</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">style</span><span class="pun">.</span><span class="pln">custom_animation_toast</span><span class="pun">;</span><span class="com">// 设置进入退出动画效果</span><span class="pln">
        mParams</span><span class="pun">.</span><span class="pln">type </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WindowManager</span><span class="pun">.</span><span class="typ">LayoutParams</span><span class="pun">.</span><span class="pln">TYPE_TOAST</span><span class="pun">;</span><span class="pln">
        mParams</span><span class="pun">.</span><span class="pln">flags </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WindowManager</span><span class="pun">.</span><span class="typ">LayoutParams</span><span class="pun">.</span><span class="pln">FLAG_KEEP_SCREEN_ON
                </span><span class="pun">|</span><span class="pln"> </span><span class="typ">WindowManager</span><span class="pun">.</span><span class="typ">LayoutParams</span><span class="pun">.</span><span class="pln">FLAG_NOT_FOCUSABLE
                </span><span class="pun">|</span><span class="pln"> </span><span class="typ">WindowManager</span><span class="pun">.</span><span class="typ">LayoutParams</span><span class="pun">.</span><span class="pln">FLAG_NOT_TOUCHABLE</span><span class="pun">;</span><span class="pln">
        mParams</span><span class="pun">.</span><span class="pln">gravity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Gravity</span><span class="pun">.</span><span class="pln">BOTTOM</span><span class="pun">;</span><span class="pln">        </span><span class="com">//对其方式</span><span class="pln">
        mParams</span><span class="pun">.</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">45</span><span class="pun">;</span><span class="pln">      </span><span class="com">//下间距</span><span class="pln">
    </span><span class="pun">}</span>

3、自定义toast弹出风格 动画的效果 。  toast_styles.xml

<span class="tag"></pre></span><span class="pln">
</span><span class="tag"><pre></span><span class="pln">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;resources&gt;
    &lt;style name="custom.animation.toast" parent="@android:style/Animation.Toast"&gt;
        &lt;item name="android:windowEnterAnimation"&gt;@anim/toast_enter&lt;/item&gt;
        &lt;item name="android:windowExitAnimation"&gt;@anim/toast_exit&lt;/item&gt;
    &lt;/style&gt;
&lt;/resources&gt;</span><span class="tag"></pre></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">><span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_copy"</span><span class="tag">><a</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"复制代码"</span><span class="tag">><img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"http://www.mikel.cn/wp-content/uploads/2015/05/copycode4.gif"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"复制代码"</span><span class="pln"> </span><span class="tag">/></a></span></span>
toast_enter.xml
复制代码

<span class="tag"></div></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">></span><span class="pln">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;set xmlns:android="http://schemas.android.com/apk/res/android" &gt;
 
&lt;translate
android:duration="1"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="85" /&gt;
&lt;translate
android:duration="350"
android:fillAfter="true"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@interpolator/accelerate_quad"
android:toXDelta="0"
android:toYDelta="-105" /&gt;
 
&lt;alpha
android:duration="100"
android:fromAlpha="0"
android:toAlpha="1" /&gt;
 
&lt;translate
android:duration="80"
android:fillAfter="true"
android:fromXDelta="0"
android:fromYDelta="0"
android:startOffset="350"
android:toXDelta="0"
android:toYDelta="20" /&gt;
 
&lt;/set&gt;</span><span class="tag"></div></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">></span>
toast_exit.xml
<span class="tag"></div></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">></span><span class="pln">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;set xmlns:android="http://schemas.android.com/apk/res/android" &gt;
 
&lt;translate
android:duration="500"
android:fromYDelta="0"
android:interpolator="@interpolator/accelerate_quad"
android:toYDelta="50%p" /&gt;
 
&lt;alpha
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.0" /&gt;
 
&lt;/set&gt;</span><span class="tag"></div></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">></span>
4、common_toast.xml
<span class="tag"></div></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">></span><span class="pln">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_common_toast"
android:orientation="horizontal" &gt;
 
&lt;TextView
android:id="@+id/toast_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="left|center"
android:textColor="@android:color/black"
android:textSize="@dimen/toast_font_size" /&gt;
 
&lt;/LinearLayout&gt;</span><span class="tag"></div></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">></span>
以上,这样就得到了一个自定义的带动画效果的view容器了。然后,怎么调用呢? 别急,我们需要再写个方法。。
<span class="tag"></div></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">></span><span class="pln">    public void show(String text, int mShowTime) {
if (mIsShow) {// 如果Toast已经在显示 就先给隐藏了
if (ManageApp.mWdm != null &amp;&amp; mToastView != null)
ManageApp.mWdm.removeView(mToastView);
// 取消计时器
if (mTimer != null) {
mTimer.cancel();
mTimer = new Timer();
}
}
//设置显示内容
mTextView.setText(text);
//设置显示状态
mIsShow = true;
// 将其加载到windowManager上
ManageApp.mWdm.addView(mToastView, mParams);
 
//设置计时器
mTimer.schedule(new TimerTask() {
@Override
public void run() {
ManageApp.mWdm.removeView(mToastView);
mIsShow = false;
}
}, (long) (mShowTime == Toast.LENGTH_LONG ? 2200 : 1200));
}</span><span class="tag"></div></span><span class="pln">
</span><span class="tag"><div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"cnblogs_code_toolbar"</span><span class="tag">></span>

大家会问mWdm是个神马?  其实它就是WindowManager(public static WindowManager mWdm;),最终还是需要使用它来吧view显示在屏幕上的。我们把它定义在程序的Application类中,并在oncreate()里初始化 mWdm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 这样就能保证他的生命周期会比我们的activity长,从而在执行计时器的时候不会报各种各样的异常。(如果有其他更好的办法,望告知。)

然后,在其他类中,使用

<span class="pln">
</span><span class="typ">ZToast</span><span class="pun">.</span><span class="pln">getInstance</span><span class="pun">(</span><span class="pln">mContext</span><span class="pun">).</span><span class="pln">show</span><span class="pun">(</span><span class="str">"我是自定义的toast"</span><span class="pun">,</span><span class="typ">Toast</span><span class="pun">.</span><span class="pln">LENGTH_LONG </span><span class="pun">);</span><span class="pln">
</span>

效果如下:

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册