无法更改绘图的颜色

Can't change color of drawing

提问人:T1D 提问时间:5/1/2023 最后编辑:T1D 更新时间:5/1/2023 访问量:49

问:

我正在创建带有网格的相机应用程序,我希望用户能够通过单击他想要使用的颜色的按钮来更改网格的颜色。网格是使用 onDraw 创建的,onDraw 位于 DrawGrid 类中,此类是从 GridMenuFragment 片段调用的,而颜色按钮位于 ColorFragment 片段中。

现在,我成功地将要使用的颜色传递给 DrawGrid,但它没有更新,网格的颜色也没有改变。我在 setCurrentColor 方法中使用 invalidate()。我尝试以与更改网格相同的方式进行颜色更改,但它不起作用。任何帮助将不胜感激。

下面是 DrawGird.java 代码:

public class DrawGrid extends View {
    int whichGrid;
    Paint paint;
    int currentColor=Color.WHITE;

    public DrawGrid(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setColor(currentColor);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
    }
    
    public void setWhichGrid(int number) {
        whichGrid = number;
        invalidate();
    }

    public void setCurrentColor(int color) {
        switch(color){
            case 0:
                currentColor=Color.WHITE;
                break;
            case 1:
                currentColor=Color.RED;
                break;
            case 2:
                currentColor=Color.BLUE;
                break;
        }
        paint.setColor(currentColor);
        invalidate();
        Log.d("DrawGrid", "currentColor is now1 " + currentColor);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Path path = new Path();
        int width = getWidth();
        int height = getHeight();
        switch (whichGrid) {
            case 1:
                float lineV1 = width / 3f;
                float lineV2 = (width / 3f) * 2f;
                float lineH1 = height / 3f;
                float lineH2 = (height / 3f) * 2f;
                Log.d("DrawGrid", "currentColor is now3 " + currentColor);
                canvas.drawLine(lineV1, 0, lineV1, height, paint);
                canvas.drawLine(lineV2, 0, lineV2, height, paint);
                canvas.drawLine(0, lineH1, width, lineH1, paint);
                canvas.drawLine(0, lineH2, width, lineH2, paint);
                break;
            case 2:
                float lineV = width / 3f;
                float lineH = height / 3f;
                canvas.drawLine(lineV, 0, lineV, height, paint);
                canvas.drawLine(0, lineH, width, lineH, paint);
                break;
            
        }
    }
}

编辑:从 ColorFragment 添加 OnCreateView,我在其中调用 DrawGrid.setCurrentColor():

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_color, container, false);

        drawGrid=new DrawGrid(getContext(), null);
        FrameLayout mainLayout = ((MainActivity)getActivity()).getRelativeLayout();
        mainLayout.removeView(drawGrid);
        mainLayout.addView(drawGrid);

        Button red = view.findViewById(R.id.button1);
        Button blue = view.findViewById(R.id.button2);
        red.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("ColorClass", "Button clicked");
                drawGrid.setCurrentColor(Color.RED);
                FragmentManager fragmentManager = requireActivity().getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.hide(ColorFragment.this).commit();
            }
        });

        blue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                drawGrid.setCurrentColor(Color.BLUE);
                FragmentManager fragmentManager = requireActivity().getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.hide(ColorFragment.this).commit();
            }
        });
        return view;
    }
Java Android Canvas 绘图 OnDraw

评论


答:

0赞 Mikhail Guliaev 5/1/2023 #1

我刚刚复制了你的代码,它有效。

你能附加你用来调用的代码吗?我敢打赌,你只是将不同于 (0,1,2) 的值传递给它,在视觉上没有任何变化。即使您传递了正确的值,问题也不在类中,因为它工作正常。DrawGrid.setCurrentColor(color)DrawGrid

如果要传递 0,1 或 2,则将使用传递的颜色重新绘制视图。

你为什么不直接提供这个方法的颜色。呼叫方将确定它要使用哪种颜色。类似的东西:

public void setCurrentColor(@ColorInt int color) {
        this.currentColor = color;
        paint.setColor(color);
        invalidate();
        Log.d("DrawGrid", "currentColor is now1 " + currentColor);
}

评论

0赞 T1D 5/1/2023
我尝试将我的代码更改为您给我的代码,但遗憾的是仍然没有。我添加到我的原始帖子 OnCreateView() 中,我从 DrawGrid 调用 setCurrentColor。
0赞 Mikhail Guliaev 5/1/2023
是的,在这种配置中它不起作用。正如我所说,你正在打电话。并且没有在 View 的方法中处理此值。此外,您还使用变量。所以我用 .现在它必须工作(我检查了它,它有效)。如果是,请将我的答案标记为正确。setCurrentColor(Color.RED)currentColorthis.currentColor = color;
0赞 T1D 5/1/2023
坏消息 - 它仍然对我不起作用:') 似乎问题出在我的开关案例上——我在 onDraw 中的切换案例之前添加了另一个日志,所以现在当我单击颜色按钮时,它成功地将颜色传递给 DrawGrid,onDraw 中的第一个日志显示在日志中,但开关案例内的日志没有显示
0赞 Mikhail Guliaev 5/1/2023
您传递给 setWhichGrid() 的值?您只处理了 1 和 2。否则,将不会绘制任何内容
0赞 T1D 5/1/2023
我正在传递正确的值。在涉足了一会儿之后,我发现两个片段都绘制到单独的网格上 - Color 片段绘制一个,我在初始化 whichGrid 时写入其编号,然后将其颜色更改为我需要的任何颜色,而 GridMenu 片段绘制我需要的网格并使用默认颜色(白色)