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表示是否可以对其中的像素进行修改。一般保持和原图片一直即可。
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: 贝塞尔曲线。
-
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));
}
使用第二种方式能够将我想要的信息打印出来。希望对有需要的同学有帮助。