我一直在努力绘制一个位图,然后用矩形突出显示一个区域。最初,我在绘画中使用alpha黑色绘制位图,使图像更暗,然后在区域中绘制原始位图,从而创建高光效果。我发现最大的减速是因为Paint
中的alpha。所以我重新编写了代码并最终在我的绘制线程中跟随:
private synchronized void drawSquare(int xStart, int yStart, int xEnd, int yEnd) {
Canvas c = holder.lockCanvas();
if(c != null) {
// Draw the background picture on top with some changed alpha channel to blend
Paint paint = new Paint();
paint.setAntiAlias(true);
if(bg != null && cWidth > 0 && cHeight > 0) {
c.clipRect(xStart, yStart, xEnd, yEnd, Region.Op.DIFFERENCE);
c.drawBitmap(bg, gTransform, blackSqr); // Draw derker background
c.clipRect(xStart, yStart, xEnd, yEnd, Region.Op.REPLACE);
c.drawBitmap(bg, gTransform, paint); ///draw original in selection
c.clipRect(0, 0, cWidth, cHeight,Region.Op.REPLACE);
}
Matrix RTcorner = new Matrix();
RTcorner.setRotate(90);
RTcorner.postTranslate(xEnd + 13, yStart - 13);
Matrix RBcorner = new Matrix();
RBcorner.setRotate(180);
RBcorner.postTranslate(xEnd + 13, yEnd + 13);
Matrix LBcorner = new Matrix();
LBcorner.setRotate(270);
LBcorner.postTranslate(xStart - 13, yEnd + 13);
// Draw the fancy bounding box
c.drawRect(xStart, yStart, xEnd, yEnd, linePaintB);
// Draw corners for the fancy box
c.drawBitmap(corner, xStart - 13, yStart - 13, new Paint());
c.drawBitmap(corner, RBcorner, new Paint());
c.drawBitmap(corner, LBcorner, new Paint());
c.drawBitmap(corner, RTcorner, new Paint());
}
holder.unlockCanvasAndPost(c);
}
因此,这会剪切出我的选区,我会使用具有此代码的颜料绘制,以使其更暗。
blackSqr.setColorFilter(new LightingColorFilter(Color.rgb(100,100,100),0));
在剪辑内的区域中,我绘制了原始位图。有用。但我对响应时间不满意。分析后,Bitmap是最长的。我已经将位图缩放到屏幕的大小,因此它绘制了300x800-ish图像。最大的资源浪费似乎是照明效果。因为当我把它关闭时,我会得到不错的响应时间。
所以我想知道我是否错过了任何改进位图绘制速度的方法,可能是缓存?或者我只是坚持这个因为我想要更暗的图像,实际上应该重新考虑“突出/选择”?为什么在2D图像中绘制带有alpha颜色的位图是如此昂贵?
答案 0 :(得分:0)
如果我理解你想要的东西,你需要一个矩形(带圆角)来突出显示另一个图像中的一个部分。
如果是这样,那么我会使用带有方形机智draw9patch的图像并将其用作图像视图上的浮动视图
RelativeLaoyut(图像容器) + - ImageView(您的实际图像) + - 视图(它将正方形作为背景,您只需将其移动到要突出显示的区域)
对不起,我不好解释自己。
答案 1 :(得分:0)
对于任何有兴趣的人,也许面临类似的问题。此解决方案适用于我的特定情况,但我有一个单独的背景位图,其中使用以下方式手动设置黑暗像素:
for(int i = 0; i < cWidth; i++){
for(int j = 0; j < cHeight; j++){
int c = bg2.getPixel(i, j);
float mult = 0.15f;
int r = (int) (Color.red(c) * mult);
int g = (int) (Color.green(c) * mult);
int b = (int) (Color.blue(c) * mult);
bg2.setPixel(i, j, Color.rgb(r, g, b));
}
}
然后使用bg2
绘制主要部分和原始(不变暗)作为选区的剪辑矩形。创建和维护第二个位图有一些开销,但与具有alpha的位图相比,绘制速度和响应时间快速而平滑。