0

我正在一个使用 ml kit 文本识别库的应用程序中工作;Rect该应用程序从图像中读取文本并在每个单词周围放置一个。现在我希望这些Rects在用户点击其中一个或在某些单词上方滑动时改变颜色。所以,我能够正确处理触摸事件,但我不能做的是改变触摸的颜色Rect

我应该在触摸的矩形上方绘制新的彩色矩形吗?或者我可以为现有的矩形着色(我认为我不能)?

类: TextGraphic GraphicOverlay//这是绘制矩形的地方

我也试过这个解决方案,所以我在课堂上输入了这个方法TextGraphic

public void changeColor(boolean isHighlighted) {
    if(isHighlighted) {
        rectPaint.setColor(COLOR_HIGHLIGHTED);
        rectPaint.setAlpha(400);//set opacity of rect
    }else{
        rectPaint.setColor(COLOR_DEFAULT);
        rectPaint.setAlpha(400);//set opacity of rect
    }
    postInvalidate();
}

并在用户触摸文本时调用它,但问题是所有Rects颜色都会改变,而且它们在运行时不会改变!

我的 ActivityClass 中的一个片段,我在其中使用了一些回调方法来传递信息。

ArrayList<Rect> rects = new ArrayList<>();

@Override
public void onAdd(FirebaseVisionText.Element element, Rect elementRect, String wordText) {
   GraphicOverlay.Graphic textGraphic = new TextGraphic(mGraphicOverlay, element);
   mTextGraphic = new TextGraphic(mGraphicOverlay, element);
   mGraphicOverlay.add(textGraphic);


   rects.add(elementRect);
}

我处理触摸事件的 ActivityClass 的片段:

@Override
public boolean onDown(MotionEvent event) {
   helper.dismissKeyboard();
   touchX = Math.round(event.getX());
   touchY = Math.round(event.getY());
   for(int x=0; x< rects.size();x++) {
       if (rects.get(x).contains(touchX, touchY)) {
           // line has been clicked
           mTextGraphic.changeColor(true);

           return true;
       }
   }
   return true;
}
4

2 回答 2

1

您正在使用mTextGraphic变量更改颜色。如果您仔细查看您的onAdd()方法,您会发现您正在分配一个mTextGraphic与绘制到屏幕上的对象无关的新对象,因为只有您使用添加到GraphicOverlay列表的对象mGraphicOverlay.add()才会被绘制到屏幕上。

因此,您需要的changeColor()不是调用mTextGraphic而是调用内部列表中已经存在的相应对象GraphicOverlay

由于里面的列表GraphicOverlay是私有的,你不能在onDown()方法中操作它。您将需要编写一个公共方法来为您完成这项工作。

GraphicOverlay在类中编写如下方法

public TextGraphic getGraphicElementAtIndex(int index) {
    return (TextGraphic)graphics.get(index)
}

现在在这样的方法的if条件中使用这个onDown()方法

if (rects.get(x).contains(touchX, touchY)) {
    // line has been clicked
    Log.d("PreviewActivity", "changeColor() is called");
    mGraphicOverlay.getGraphicElementAtIndex(x).changeColor();
    touchedText = texts.get(x);
    return true;
}

希望这可以帮助。

旁注:即使在此之后,如果由于某种原因rects列表和graphics列表(位于内部GraphicOverlay)中的对象的顺序发生了变化,那么您会看到当您单击一个矩形时,其他一些矩形会改变颜色。

于 2019-12-02T15:33:45.250 回答
0

也许你不应该通过编码而是通过 ColorStateList Android 开发人员:colorstatelist

于 2019-11-28T10:08:52.937 回答