Android:我画了很多形状。每当我单击它时,我都需要更改形状的颜色

Posted

技术标签:

【中文标题】Android:我画了很多形状。每当我单击它时,我都需要更改形状的颜色【英文标题】:Android: I have many shapes drawn. I need to change a shape's color whenever I click on it 【发布时间】:2017-05-04 11:25:03 【问题描述】:

我有两个类:CustomView 扩展 View 和 MainActivity 扩展 Activity。在 CustomView 中,我使用循环绘制了一系列圆角正方形 (canvas.drawRoundRect)。我知道如何检测任何给定方块上的点击,但我不知道如何更改方块的颜色。如何从 MainActivity 调用 onDraw 方法?或者,如果有一个更新方法,我可以使用 MainActivity 类中的 invalidate() 方法。底线是我想知道当我点击它时如何改变我的形状的颜色。谢谢。

【问题讨论】:

视图有一个invalidate()方法,会调用onDraw方法developer.android.com/reference/android/view/… 【参考方案1】:

使用以下内容:一旦您在 Java 代码中命名并声明了它们的形式,您可以按如下方式对其进行更改,按名称调用对象并放置以下内容:

"Name of the object" .setbackgroundColor ("Name of the object" .getContext ().GetResources (). GetColor (R.color. "Desired color")

【讨论】:

【参考方案2】:

在您的 onDraw() 方法中,通过在变量中设置颜色来绘制矩形

@Override
protected void onDraw(Canvas canvas) 
    super.onDraw(canvas);
    firstPaint.setColor(firstRectColor);
    canvas.drawRoundRect(//..,firstPaint);
    //..
    setOnTouchListener(new View.OnTouchListener() 
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) 
            if(motionEvent.getAction()==MotionEvent.ACTION_DOWN)
               if(((motionEvent.getX()>=firstRectX) && (motionEvent.getX()<=firstRectX+firstRectWidth))&&((motionEvent.getY()>=firstRectY) && (motionEvent.getY()<=firstRectY+firstRectHeight)))
                //touch point is inside first rectangle
                //assign the color to firstRectColor variable and call invalidate to redraw
                firstRectColor=getColorToChange();
                invalidate();
               //..else if()
             
            return true;
        
    );

【讨论】:

【参考方案3】:

为此,您需要获取单击像素的颜色,然后使用下面的 Flood-fill 算法并传递您的位图、您在位图上单击的点、目标和替换颜色代码。

  private void FloodFill(Bitmap bmp, Point pt, int targetColor, int replacementColor) 
    
        Queue<Point> q = new LinkedList<Point>();
        q.add(pt);
        while (q.size() > 0) 
            Point n = q.poll();
            if (bmp.getPixel(n.x, n.y) != targetColor)
                continue;

            Point w = n, e = new Point(n.x + 1, n.y);
            while ((w.x > 0) && (bmp.getPixel(w.x, w.y) == targetColor)) 
                bmp.setPixel(w.x, w.y, replacementColor);
                if ((w.y > 0) && (bmp.getPixel(w.x, w.y - 1) == targetColor))
                    q.add(new Point(w.x, w.y - 1));
                if ((w.y < bmp.getHeight() - 1)
                        && (bmp.getPixel(w.x, w.y + 1) == targetColor))
                    q.add(new Point(w.x, w.y + 1));
                w.x--;
            
            while ((e.x < bmp.getWidth() - 1)
                    && (bmp.getPixel(e.x, e.y) == targetColor)) 
                bmp.setPixel(e.x, e.y, replacementColor);

                if ((e.y > 0) && (bmp.getPixel(e.x, e.y - 1) == targetColor))
                    q.add(new Point(e.x, e.y - 1));
                if ((e.y < bmp.getHeight() - 1)
                        && (bmp.getPixel(e.x, e.y + 1) == targetColor))
                    q.add(new Point(e.x, e.y + 1));
                e.x++;
            
        
    

您可以搜索更多关于洪水填充算法的信息以了解击球手。

https://github.com/latemic/ColorBooth/blob/master/src/com/colorbooth/FloodFill.java

【讨论】:

以上是关于Android:我画了很多形状。每当我单击它时,我都需要更改形状的颜色的主要内容,如果未能解决你的问题,请参考以下文章

颤振图像自定义形状

我以前一直没有真正理解支持向量机,直到我画了一张图!

我画了近百张图来理解红黑树

快速简单的DNA画法

我画了近百张图来理解红黑树

我画了近百张图来理解红黑树