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; }
问题根源
- 实例不匹配:你在
ColorFragment里新建了一个DrawGrid实例,但界面上显示的是GridMenuFragment中创建的旧实例,修改新实例的颜色自然不会影响到显示的网格。 - 参数传递错误:
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
相关产品推荐
相关产品推荐

