Android 最近遇到的问题解决 20201103

690 阅读3分钟

1 获取和修改bitmap上的像素的颜色

最近有一个需求,修改image中的某一块区域,该区域是不规则的颜色。 最先想到的是重新生成一张图片,设置到image中。但这样如果操作比较频繁的话, 非常吃内存。

后面的做法是,在生成图片的时候,将对应的区域保存在一个key-value的map中,

key:对应的区域
value: 该区域中,所有该像素点在bitmap上的坐标。

在需要修改某一个区域的颜色的时候,只需要获取key对应的修改对应区域所有的坐标。 然后修改bitmap上,


2 传递、复制 Bitmap的几种方法

最简单的就是使用 = 进行 引用传递.

但通常我们要的不是这种简单的引用传递。

复制bitmap的方法:

Bitmap src = ...;
Bitmap dst = src.copy(src.getConfig,src.isMutable);

其中第一个参数表示源图片的一些基本配置,比如说宽高,显示配置。

第二个参数 isMutable表示是否可以对其中的像素进行修改。一般保持和原图片一直即可。

复制bitmap的参考链接


3 onAnimationEnd 调用两次

在执行动画的时候,设置了动画监听器。

view.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
            }
        });

但在执行过程中,发现在动画结束的时候, onAnimationEnd这个方法会回调两次。百思不得其解。应该是在listener在执行过程中由于某些原因回调了两次。

在网上找到的一个解决方案是,在回调 onAnimationEnd 中,先调用一次下面的方法。

 view.setAnimationListener(null);
 

但这样做有一个缺点,就是每次用到 animationListener的时候,都需要重新设置一下。

还有一个办法是设置一个标志位,如果已经收到了animationEnd这个回调了,就修改该标志位,用标志位判断是否需要再次处理。

另外,在测试过程中,发现 animation.cancel(),最终也会回调 onAnimationEnd这个方法。读过源码之后,发现确实是在cancel之后回调了animationEnd的方法。

这里也是需要注意的地方。


4 Android Path 的骚操作

如题,对于path,我们最常用的方法就是 path.lineTo(), path.moveTo(), 但还有好多其他的方法。

  • path 常用方法

    • path.rLineTo(x,y): 以当前坐标为起点,偏移量为 x,y的点为终点。 其中,rLineTo中的 r 是英文的relative,表示相对的意思。

      即相对于当前点偏移了 x,y.

    • path.rMoveTo(x,y): 同理,移动到偏移量为 x,y 的点。

    • path.addRect():绘制矩形。绘制图形这块儿,我经常用的是canvas直接绘制矩形。

      path.addRect 和下面的 addRoundRect/addCircle/addOval/addarcTo 等所有add方法,可以用在组合图形的场景。

      比如说,我们绘制一条曲线,同时还要绘制一个多个矩形/圆形.这是我们就可以先 add 所有需要绘制的图形。最后再canvase.drawPath.

    • path.addRoundRect()/path.addCircle()/path.addOval()/path.addArc()/path.arcTo() add 一切。

      有一点需要注意,addArc 和 arcTo方法中。 arcTo 会判断当前圆弧的起始点和上一个点之间是否连线。

      arcTo(rectf,0,90, true), 最后一个boolean, true 表示和上一个点不连接,false 表示连接。

    • path.close(): 表示最后一个点和起始点闭合。

    • path.quadTo/rQuardTo/cubicTo/rCubicTo: 贝塞尔曲线。

    参考链接1 :Android Canvas之Path操作

    参考链接2:Hencoder Android 开发进阶 UI 部分 1-1:绘制基础

    参考链接3: Android Path详解


5 如何打印/查看 e.printStackTrace()

我们在 try/catch 中,想要尝试打印出 strackTrace 的日志。但有时打印不出来。

	try {
    	    // some code
    	} catch (Exception e) {
    
    	e.printStackTrace();//无效,打印不出日志来。
    }

之后在网上查了查资料,发现可以通过 Log的形式打印出来:

	try {
    	    // some code
    	} catch (Exception e) {
    
    	Log.e(TAG, Log.getStackTraceString(e));
    }

使用第二种方式能够将我想要的信息打印出来。希望对有需要的同学有帮助。

参考1:Where do I see printed stack trace in Android Studio?

参考2:如何查看 e.printStackTrace()