software - android wiki




কিভাবে অ্যান্ড্রয়েড একটি Drawable রং পরিবর্তন? (12)

আমি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনে কাজ করছি, এবং আমার কাছে একটি টেকসই আছে যে আমি একটি উত্স চিত্র থেকে লোড করছি। এই ছবিতে, আমি সব সাদা পিক্সেলকে একটি ভিন্ন রঙে রূপান্তর করতে চাই, নীল বলে, এবং তারপরে ফলাফলটি আঁকতে সক্ষম বস্তুকে ক্যাশ করতে পারি যাতে আমি পরে এটি ব্যবহার করতে পারি।

উদাহরণস্বরূপ, উদাহরণস্বরূপ বলুন আমার একটি 20x20 PNG ফাইল রয়েছে যার মাঝখানে একটি সাদা বৃত্ত রয়েছে, এবং বৃত্তের বাইরে থাকা সবকিছুই স্বচ্ছ। যে সাদা বৃত্ত নীল এবং ফলাফল ক্যাশে সবচেয়ে ভাল উপায় কি? যদি আমি সেই নতুন ইমেজ তৈরি করতে উৎস উত্সটি ব্যবহার করতে চাই তবে উত্তরটির পরিবর্তন হবে (নীল, লাল, সবুজ, কমলা, ইত্যাদি বলে)?

আমি অনুমান করছি যে আমি কোনওভাবে একটি রঙ ম্যাট্রিক্স ব্যবহার করতে চাই, তবে আমি নিশ্চিত নই।


অনেকগুলি সমাধান আছে তবে রঙের সংস্থার এক্সএমএল ফাইলটিতে ইতিমধ্যে রঙ নেই বলে কেউ সুপারিশ করলে আমরা নীচের মতো সরাসরি এখানেও বাছাই করতে পারি:

ImageView imageView = (ImageView) findViewById(R.id.imageview);
imageView.setColorFilter(getString(R.color.your_color));

আপনার কার্যকলাপে আপনি একটি PNG ইমেজ রিসোর্সকে একক রঙ দিয়ে টিন করতে পারেন:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myColorTint();
    setContentView(R.layout.activity_main);
}

private void myColorTint() {
    int tint = Color.parseColor("#0000FF"); // R.color.blue;
    PorterDuff.Mode mode = PorterDuff.Mode.SRC_ATOP;
    // add your drawable resources you wish to tint to the drawables array...
    int drawables[] = { R.drawable.ic_action_edit, R.drawable.ic_action_refresh };
    for (int id : drawables) {
        Drawable icon = getResources().getDrawable(id);
        icon.setColorFilter(tint,mode);
    }
}

এখন যখন আপনি R.drawable ব্যবহার করেন। * এটি পছন্দসই টিন্ট দিয়ে রঙ করা উচিত। আপনি অতিরিক্ত রং প্রয়োজন হলে আপনি ড্র্যাগযোগ্য .mutate () করতে সক্ষম হওয়া উচিত।


আপনি সমস্ত APIs জন্য এটি করা উচিত:

Drawable myIcon = getResources().getDrawable( R.drawable.button ); 
ColorFilter filter = new LightingColorFilter( Color.BLACK, Color.BLACK);
myIcon.setColorFilter(filter);

আমার মনে হয় আপনি আসলেই Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY ) ব্যবহার করতে পারেন। এটি সাদা পিক্সেলগুলিকে লালতে সেট করবে তবে আমি মনে করি না এটি স্বচ্ছ পিক্সেলগুলিকে প্রভাবিত করবে।

Drawable#setColorFilter দেখুন


আমি জানি এই ললিপপের আগেই এই প্রশ্ন জিজ্ঞাসা করা হয়েছিল কিন্তু আমি অ্যান্ড্রয়েড 5 এ এটি করার একটি চমৎকার উপায় যোগ করতে চাই। +। আপনি একটি এক্সএমএল অঙ্কনযোগ্য যা মূলটি উল্লেখ করে এবং এটিতে টিন্ট সেট করে:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_back"
    android:tint="@color/red_tint"/>

আরো তথ্যের জন্য এই উপর আমার ব্লগ পোস্ট দেখুন


আমি নিম্নলিখিত কোডটি দিয়ে এটি করতে সক্ষম হয়েছিলাম, যা কোন কার্যকলাপ থেকে নেওয়া হয়েছে (লেআউটটি খুব সহজ, কেবল একটি চিত্র ভিউ রয়েছে এবং এখানে পোস্ট করা হয় না)।

private static final int[] FROM_COLOR = new int[]{49, 179, 110};
private static final int THRESHOLD = 3;

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_colors);

    ImageView iv = (ImageView) findViewById(R.id.img);
    Drawable d = getResources().getDrawable(RES);
    iv.setImageDrawable(adjust(d));
}

private Drawable adjust(Drawable d)
{
    int to = Color.RED;

    //Need to copy to ensure that the bitmap is mutable.
    Bitmap src = ((BitmapDrawable) d).getBitmap();
    Bitmap bitmap = src.copy(Bitmap.Config.ARGB_8888, true);
    for(int x = 0;x < bitmap.getWidth();x++)
        for(int y = 0;y < bitmap.getHeight();y++)
            if(match(bitmap.getPixel(x, y))) 
                bitmap.setPixel(x, y, to);

    return new BitmapDrawable(bitmap);
}

private boolean match(int pixel)
{
    //There may be a better way to match, but I wanted to do a comparison ignoring
    //transparency, so I couldn't just do a direct integer compare.
    return Math.abs(Color.red(pixel) - FROM_COLOR[0]) < THRESHOLD &&
        Math.abs(Color.green(pixel) - FROM_COLOR[1]) < THRESHOLD &&
        Math.abs(Color.blue(pixel) - FROM_COLOR[2]) < THRESHOLD;
}

এই কোডটি চেষ্টা করে দেখুন:

ImageView lineColorCode = (ImageView)convertView.findViewById(R.id.line_color_code);
int color = Color.parseColor("#AE6118"); //The color u want             
lineColorCode.setColorFilter(color);

এই নমুনা কোডটি দেখুন " ColorMatrixSample.java "

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.apis.graphics;

import com.example.android.apis.R;

import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;

public class ColorMatrixSample extends GraphicsActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SampleView(this));
    }

    private static class SampleView extends View {
        private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        private ColorMatrix mCM = new ColorMatrix();
        private Bitmap mBitmap;
        private float mSaturation;
        private float mAngle;

        public SampleView(Context context) {
            super(context);

            mBitmap = BitmapFactory.decodeResource(context.getResources(),
                                                   R.drawable.balloons);
        }

        private static void setTranslate(ColorMatrix cm, float dr, float dg,
                                         float db, float da) {
            cm.set(new float[] {
                   2, 0, 0, 0, dr,
                   0, 2, 0, 0, dg,
                   0, 0, 2, 0, db,
                   0, 0, 0, 1, da });
        }

        private static void setContrast(ColorMatrix cm, float contrast) {
            float scale = contrast + 1.f;
               float translate = (-.5f * scale + .5f) * 255.f;
            cm.set(new float[] {
                   scale, 0, 0, 0, translate,
                   0, scale, 0, 0, translate,
                   0, 0, scale, 0, translate,
                   0, 0, 0, 1, 0 });
        }

        private static void setContrastTranslateOnly(ColorMatrix cm, float contrast) {
            float scale = contrast + 1.f;
               float translate = (-.5f * scale + .5f) * 255.f;
            cm.set(new float[] {
                   1, 0, 0, 0, translate,
                   0, 1, 0, 0, translate,
                   0, 0, 1, 0, translate,
                   0, 0, 0, 1, 0 });
        }

        private static void setContrastScaleOnly(ColorMatrix cm, float contrast) {
            float scale = contrast + 1.f;
               float translate = (-.5f * scale + .5f) * 255.f;
            cm.set(new float[] {
                   scale, 0, 0, 0, 0,
                   0, scale, 0, 0, 0,
                   0, 0, scale, 0, 0,
                   0, 0, 0, 1, 0 });
        }

        @Override protected void onDraw(Canvas canvas) {
            Paint paint = mPaint;
            float x = 20;
            float y = 20;

            canvas.drawColor(Color.WHITE);

            paint.setColorFilter(null);
            canvas.drawBitmap(mBitmap, x, y, paint);

            ColorMatrix cm = new ColorMatrix();

            mAngle += 2;
            if (mAngle > 180) {
                mAngle = 0;
            }

            //convert our animated angle [-180...180] to a contrast value of [-1..1]
            float contrast = mAngle / 180.f;

            setContrast(cm, contrast);
            paint.setColorFilter(new ColorMatrixColorFilter(cm));
            canvas.drawBitmap(mBitmap, x + mBitmap.getWidth() + 10, y, paint);

            setContrastScaleOnly(cm, contrast);
            paint.setColorFilter(new ColorMatrixColorFilter(cm));
            canvas.drawBitmap(mBitmap, x, y + mBitmap.getHeight() + 10, paint);

            setContrastTranslateOnly(cm, contrast);
            paint.setColorFilter(new ColorMatrixColorFilter(cm));
            canvas.drawBitmap(mBitmap, x, y + 2*(mBitmap.getHeight() + 10),
                              paint);

            invalidate();
        }
    }
}

প্রাসঙ্গিক এপিআই here পাওয়া here :


নতুন সমর্থন v4 ফিরে api 4 ফিরে tint আনা।

আপনি এটা ভালো করতে পারেন

public static Drawable setTint(Drawable d, int color) {
    Drawable wrappedDrawable = DrawableCompat.wrap(d);
    DrawableCompat.setTint(wrappedDrawable, color);
    return wrappedDrawable;
}

যখন আপনি লাইব্রেরি ব্যবহার করেন তখন এটি খুব সহজ। এই library চেষ্টা করুন

আপনি এই মত কল করতে পারেন:

Icon.on(holderView).color(R.color.your_color).icon(R.mipmap.your_icon).put();

isWorking ক্ষেত্র অনুযায়ী isWorking রং পরিবর্তন সংক্ষিপ্ত উদাহরণ।

আমার আকৃতি এক্সএমএল:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@android:color/holo_blue_bright" />
    <corners android:radius="30dp" />
    <size
        android:height="15dp"
        android:width="15dp" />
</shape>

আমার পদ্ধতি পরিবর্তন করতে:

private Drawable getColoredDrawable(int drawableResId, boolean isworking) {
    Drawable d = getResources().getDrawable(R.drawable.shape);
    ColorFilter filter = new LightingColorFilter(
            isworking ? Color.GREEN : Color.RED,
            isworking ? Color.GREEN : Color.RED);
    d.setColorFilter(filter);
    return d;
}

ব্যবহারের উদাহরণ:

text1.setCompoundDrawablesWithIntrinsicBounds(getColoredDrawable(R.drawable.shape, isworking()), null, null, null);

আপনি Android সমর্থন কম্প্যাট লাইব্রেরি ব্যবহার করে এটি সমাধান করতে পারেন। :)

 // mutate to not share its state with any other drawable
 Drawable drawableWrap = DrawableCompat.wrap(drawable).mutate();
 DrawableCompat.setTint(drawableWrap, ContextCompat.getColor(getContext(), R.color.your_color))




android