华为Toast显示
因为华为系统对Toast进行了定制,所以如果两个触发时机非常接近的Toast,华为只会显示一个。例:
1 | Toast.makeText(this, "this is toast 1", Toast.LENGTH_SHORT).show(); |
则华为手机只会显示最后一个toast。
背景绘制
最近在做项目的时候,需要给一个Fragment的背景绘制上倾斜的水印,水印的绘制通过自定义drawable,重写draw()方法生成一张drawable,然后用setBackground()设置为背景。
水印生成的代码如下:
1 | public class WarterMarkDrawable extends Drawable { |
一开始这方法生成的drawable都没有问题,也没有造成内存泄露。直到遇到了华为MT7 4.4系统,用这方法生成水印背景,导致所有设置该背景的Fragment内容全部变成倾斜。在前辈的帮助下,定位问题,可能是在draw()方法里面绘制背景的时候,用canvas.rotate(rotate);对整个画布进行旋转,华为MT7 4.4系统应该把所有的内容(包括listview等)都绘制在canvas上面,是得在进行选择的时候,不是对该背景的canvas进行旋转,而是旋转了所有的view。
更新:经过多个机型匹配发现,这是Android4.4手机系统都会有的问题
前辈说在onDraw()函数加canvas.save()和canvas.restore()可以解决问题,还没验证
对生成自定义drawable进行了改造。
1 | public class WarterMarkDrawable extends Drawable { |
增加了一个bitmap成员,在华为MT7 系统上,先生成一个不旋转的水平的水印背景drawable,将改drawable转化成bitmap,然后对该bitmap进行旋转,绘制在canvas上,避免了旋转canvas。
在外围调用的时候
1 | // 先生成一张drawable 若是华为MT7系统 则生成的是不旋转的水平drawable |
总结:简直被华为系统坑爆了。。。