我有一个用 Canvas 绘制的座位图像列表,我希望当我单击图像时它会改变颜色。现在每次我点击它都会改变颜色。有谁知道如何解决这个问题?
setUp 是一个函数,用于设置使用 Canvas 绘制图像所需的东西
private void setUp() {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icons8_bus_36_border);
tempBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
tempCanvas = new Canvas(tempBitmap);
tempCanvas.drawBitmap(bitmap, 0, 0, mPaint);
if (bitmap == null) {
Log.d(TAG, "setUp: null");
} else {
Log.d(TAG, "setUp: not null");
}
}
sequentially是我用Canvas画图的函数
private void sequentially() {
setUp();
imageList = new HashMap<>();
chooseColor = Color.parseColor("#1A86C8");
seat.setGravity(Gravity.CENTER);
LinearLayout row = new LinearLayout(getActivity());
row.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams firstImg = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
firstImg.setMargins(10, 0, 0, 0);
LinearLayout.LayoutParams forRow = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
forRow.setMargins(0, 0, 0, 15);
for (int j = 0; j < 2; j++) {
row = new LinearLayout(getActivity());
row.setLayoutParams(forRow);
seat.addView(row);
for (int i = 0; i < 3; i++) {
countForImage++;
imageView = new ImageView(getActivity());
imageList.put(countForImage, imageView);
Log.d(TAG, "sequentially: number" + countForImage);
imageView.setLayoutParams(firstImg);
tempCanvas.drawBitmap(bitmap, 0, 0, mPaint);
imageView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap));
row.addView(imageView);
if (i == 1 && j == 0) {
imageView.setVisibility(View.INVISIBLE);
}
}
}
}
loopSet 是我用来设置颜色变化事件的函数
public void loopSeat(Map<Integer, ImageView> map) {
Log.d(TAG, "loopSeat: running");
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
final Map.Entry pair = (Map.Entry) iterator.next();
final ImageView imageView = (ImageView) pair.getValue();
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick at number= :" + pair.getKey());
setColor(imageView);
}
});
Log.d(TAG, "loopSeat: key= " + pair.getKey());
}
}
setColor 将是负责改变图像颜色的函数
public void setColor(ImageView imageView) {
color,need to fix
Log.d(TAG, "setColor running");
mPaint = new Paint(chooseColor);
ColorFilter filter = new LightingColorFilter(chooseColor, 1);
mPaint.setColorFilter(filter);
Bitmap bm=((BitmapDrawable)imageView.getDrawable()).getBitmap();
tempCanvas.drawBitmap(bm, 0, 0, mPaint);
imageView.setImageDrawable(new BitmapDrawable(getResources(), bm));
}
最佳答案
因为ImageView的Bitmap实例是一样的。您需要为每个 ImageView 复制到一个新的位图: https://developer.android.com/reference/android/graphics/Bitmap.html#copy(android.graphics.Bitmap.Config,%20boolean)
尽管我建议使用 ImageView 的 tint 属性: How to set tint for an image view programmatically in android?
关于android - 如何更改用 Canvas 绘制的图像的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54740353/