大家都知道,Android的控件有时候很难满足我们的需求,所以我们需要自定义View。自定义的方式很多,有继承原生控件也有直接自定义View的,今天写的是自定义的Toast,当然,这个不是复写Toast,是换一种表达形式,哈哈,后续会增加自定义View的方方面面

先来看看效果图吧

是不是挺好看的,如果你看过Toast的源码就会知道,他主要是用了WindowManager,我们也直接来写一个

TabToast

package com.lgl.toast;import android.content.Context;import android.text.TextUtils;import android.util.DisplayMetrics;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;public class TabToast {/** * Toast字体大小 */private static final float DEFAULT_TEXT_SIZE = 14;/** * Toast字体颜色 */private static final int DEFAULT_TEXT_COLOR = 0xffffffff;/** * Toast背景颜色 */private static final int DEFAULT_BG_COLOR = 0xE6f5695a;/** * Toast的高度(单位dp) */private static final float DEFAULT_TOAST_HEIGHT = 50.0f;private static Context mContext;private volatile static TabToast mInstance;private static Toast mToast;private View layout;private TextView tv;public TabToast(Context context) {mContext = context;}/** * 单例模式 * * @param context * 传入的上下文 * @return TabToast实例 */private static TabToast getInstance(Context context) {if (mInstance == null) {synchronized (TabToast.class) {if (mInstance == null) {mInstance = new TabToast(context.getApplicationContext());}}}return mInstance;}private static void getToast(int duration) {//设置位置int gravity, int xOffset, int yOffsetif (mToast == null) {mToast = new Toast(mContext);mToast.setGravity(Gravity.BOTTOM, 0, 0);//设置显示时间mToast.setDuration(duration == Toast.LENGTH_LONG ? Toast.LENGTH_LONG: Toast.LENGTH_SHORT);}}public static void makeText(Context context, String text) {makeText(context, text, Toast.LENGTH_SHORT);}public static void makeText(Context context, String text, int duration) {getInstance(context);getToast(duration);if (mInstance.layout == null || mInstance.tv == null) {LinearLayout container = new LinearLayout(mContext);LinearLayout.LayoutParams rootParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);container.setLayoutParams(rootParams);container.setBackgroundColor(DEFAULT_BG_COLOR);container.setGravity(Gravity.CENTER);mInstance.tv = new TextView(mContext);LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(getScreenWidth(mContext), dp2px(DEFAULT_TOAST_HEIGHT));mInstance.tv.setLayoutParams(tvParams);mInstance.tv.setPadding(dp2px(5), dp2px(2), dp2px(5), dp2px(2));mInstance.tv.setGravity(Gravity.CENTER);mInstance.tv.setTextColor(DEFAULT_TEXT_COLOR);mInstance.tv.setMaxLines(2);mInstance.tv.setEllipsize(TextUtils.TruncateAt.END);mInstance.tv.setBackgroundColor(DEFAULT_BG_COLOR);mInstance.tv.setTextSize(DEFAULT_TEXT_SIZE);container.addView(mInstance.tv);mInstance.layout = container;mToast.setView(mInstance.layout);}mInstance.tv.setText(text);mToast.show();}/** * dp转px * * @param value * dp * @return px */public static int dp2px(float value) {float scale = mContext.getResources().getDisplayMetrics().density;return (int) (value * scale + 0.5f);}/** * 获得屏幕宽度 * * @param context * Context * @return px */public static int getScreenWidth(Context context) {WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);float density = outMetrics.density;return (int) (outMetrics.widthPixels * density);}}

然后直接调用就可以了

TabToast.makeText(MainActivity.this, "自定义Toast");

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9391760

android dp转px的公式_Android特效专辑——自定义不一样的Toast相关推荐

  1. android dp转px的公式_dp和px换算公式

    dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...

  2. android dp转px的公式_公式px到dp,dp到px android

    注意:上面广泛使用的解决方案基于displayMetrics.density.但是,文档解释说这个值是一个舍入值,与屏幕"桶"一起使用.例如.在我的Nexus 10上,它返回2,其 ...

  3. Android dp转px,sp转px

    /*** 将dip或dp值转换为px值,保证尺寸大小不变*/ public static int dip2px(Context context, float dipValue) {final floa ...

  4. Android dp与px的转换

    密度类型 代表的-------分辨率(px) 屏幕密度(dpi) 换算(px/dp) 比例 低密度(ldpi)---------- 240x320------- 120 --------------- ...

  5. Android的计量单位px,in,mm,pt,dp,dip,sp

    px   :是屏幕的像素点 in    :英寸 mm :毫米 pt    :磅,1/72 英寸 dp   :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px dip  :等 ...

  6. 设计中涉及到的dip、dp、px、sp等单位说明

    在进行UI设计中常会遇到各种数值单位,开始使用时也常搞混,于是搜集了单位解说的文章与大家一同分享 dip: device independent pixels(设备独立像素). 不同设备有不同的显示效 ...

  7. dp和px的区别,dp与px换算关系

    一.首先要认识下:屏幕密度ppi ppi  pixles percent inch  每英寸的像素数 ppi = 水平方向的像素数 / 屏幕宽度 例如:3.7in   480 x 800        ...

  8. android 字体像素转换工具类_android px,dp,sp大小转换工具

    package com.voole.playerlib.util; import android.content.Context; /** * Android大小单位转换工具类 * * float s ...

  9. android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解

    PX(pixel): 即传统计算机语言中描述的像素,在Android则代表绝对像素. 之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一. 举例来 ...

最新文章

  1. GitHub 标星 2.5K+,U^2-Net 跨界肖像画,完美复刻人物细节!
  2. Java获取数据库表的字段信息,及如何将ResultSet转为json
  3. Java游戏地下城_地下城与勇士DNF-鬼剑士
  4. 事物的开始和结束命令分别是什么_人教版小学四年级语文下册期末测试题及答案[1]...
  5. Python学习14 模块和包
  6. 最小的html5页面,第一个html5+响应式页面
  7. 如何删除顽固文件或文件夹?
  8. 一文搞懂移动端单位em、rem、vh、vw
  9. 格灵深瞳,天才AI公司跌入谷底之后 | 小败局
  10. SDS(Spoken Dialogue System) 对话系统
  11. 解决vue项目格式报错问题_@jie
  12. mac百度网盘加速下载
  13. includes的使用
  14. 如何用Python求解微分方程组
  15. Typora+MarkDown
  16. ICPC 2018 南京站游记
  17. python循环里使用len()与计算出len()后速度有区别吗
  18. 微软人工智能-深度学习框架和工具.md
  19. Android安卓原生接入微信app支付PHP服务端
  20. 【B类比赛】 第十一届蓝桥杯 省国赛经历

热门文章

  1. 十四、Python第十四课——文件和异常
  2. html和css哪个优先,CSS3 | 样式和优先级
  3. bugku 杂项 就五层你能解开吗_长春老旧小区加装电梯,你家符合条件吗?_媒体_澎湃新闻...
  4. c中获取python控制台输出_在真实的tim中用C捕获控制台python打印
  5. c是过程化语言吗数据库,A.数据库语言B.过程化语言C.宿主语言D.数据库管理系统...
  6. 怎么用计算机算立方数,计算器的使用方法
  7. FTP命令:下载,上传FTP服务器中的文件
  8. 运行shell脚本报错:“syntax error near unexpected token fi 的解决方法
  9. JDK源码解析之Java.util.Collections
  10. linux 调优系列