You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android相机应用网格颜色无法修改问题求助

相机应用网格颜色无法更新的问题

我正在开发一款带网格的相机应用,希望用户点击对应颜色按钮修改网格颜色。网格由DrawGrid类的onDraw方法绘制,该类在GridMenuFragment中调用,颜色按钮位于ColorFragment里。目前已经能把目标颜色传递到DrawGrid,但网格颜色没更新——我已经在setCurrentColor方法里调用了invalidate(),也试过用修改网格的方式改颜色,都没用,求帮忙。

相关代码

DrawGrid.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方法

@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;
}

问题根源

  1. 实例不匹配:你在ColorFragment里新建了一个DrawGrid实例,但界面上显示的是GridMenuFragment中创建的旧实例,修改新实例的颜色自然不会影响到显示的网格。
  2. 参数传递错误:setCurrentColor方法接收的是0/1/2这类标识值,你直接传Color.RED这类颜色常量,会导致switch分支不匹配,颜色设置无效。

解决方案

1. 获取已有DrawGrid实例

不要在ColorFragment中新建实例,改为获取GridMenuFragment中已存在的实例。可以通过以下方式实现:

  • 在MainActivity中保存DrawGrid的全局实例,并提供获取方法;
  • 用Fragment通信机制(如ViewModel、接口)传递实例或颜色值。

2. 修改ColorFragment代码

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

    // 替换为获取MainActivity中已有的DrawGrid实例
    drawGrid = ((MainActivity)getActivity()).getDrawGridInstance();

    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");
            // 传对应标识值1,匹配switch中的红色分支
            drawGrid.setCurrentColor(1);
            requireActivity().getSupportFragmentManager()
                .beginTransaction()
                .hide(ColorFragment.this)
                .commit();
        }
    });

    blue.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // 传对应标识值2,匹配switch中的蓝色分支
            drawGrid.setCurrentColor(2);
            requireActivity().getSupportFragmentManager()
                .beginTransaction()
                .hide(ColorFragment.this)
                .commit();
        }
    });
    return view;
}

3. 补充MainActivity的实例管理

在MainActivity中添加:

private DrawGrid drawGridInstance;

// 当GridMenuFragment创建DrawGrid时,调用此方法保存实例
public void setDrawGridInstance(DrawGrid instance) {
    this.drawGridInstance = instance;
}

public DrawGrid getDrawGridInstance() {
    return drawGridInstance;
}

内容的提问来源于stack exchange,提问作者T1D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:17:07