android - 如何更改用 Canvas 绘制的图像的颜色?

标签 android

我有一个用 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/

相关文章:

android - 是否有构建 Xamarin.Forms 项目的最有效方法?

android - 在模拟器 2.2 中安装 android 市场应用程序

android - 使用类名启动 Activity Android

java.lang.ClassCastException : ish. message.Message 无法转换为 android.app.Application

android - 谷歌地图未在发布版本中显示

android - 无法重播 android 支持库 v4

android - 当尝试将监听器添加到以编程方式添加的 textview 时,只有最后一个按预期工作

android - 无法解析 com.google.firebase :firebase-core:10. 0.1

android - 选择超出最小或最大日期的日期时,DatePicker 会崩溃。安卓5.1

java - 在 Intent.ACTION_OPEN_DOCUMENT_TREE 返回的目录中创建新文件