অ্যান্ড্রয়েড স্টুডিওতে ভেক্টর সম্পদে ভরাট রঙ পরিবর্তন করুন


169

অ্যান্ড্রয়েড স্টুডিও এখন 21+ তে ভেক্টর সম্পদ সমর্থন করে এবং সংকলন সময়ে কম সংস্করণের জন্য পিএনজি উত্পন্ন করবে। আমার একটি ভেক্টর সম্পদ রয়েছে (ম্যাটারিয়াল আইকন থেকে) যা আমি পূরণের রঙটি পরিবর্তন করতে চাই। এটি 21+ এ কাজ করে তবে উত্পাদিত png গুলি রঙ পরিবর্তন করে না। এই কাজ করতে একটি উপায় আছে কি?

<vector android:height="48dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/primary" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>

উত্তর:


333

ভেক্টর সম্পদগুলি সরাসরি সম্পাদনা করবেন না। আপনি যদি ইমেজবাটনে একটি ভেক্টর আঁকতে সক্ষম ব্যবহার করে থাকেন তবে কেবল নিজের রঙটি এর মধ্যে চয়ন করুন android:tint

<ImageButton
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:id="@+id/button"
        android:src="@drawable/ic_more_vert_24dp"
        android:tint="@color/primary" />

24
টিন্টিং কেবল 21+ ডিভাইসগুলিতে কাজ করে, প্রি-ললিপপ ডিভাইসের জন্য আপনার কোনও পরামর্শ আছে
মুডিট করুন

12
অ্যান্ড্রয়েড: টিআইপিআইপিভি 1 এর পর থেকে সমস্ত অ্যান্ড্রয়েড সংস্করণে কাজ করে। আপনি যা বলতে চাইছেন তা হচ্ছে অঙ্কনযোগ্য টিন্ট।
YYYY-MM-DD

31
android:tintঅবশ্যই হতে হবেandroid:src
EmmanuelMess

5
কি drawableLeftমধ্যে Button?
প্রতীক বুটানি

8
@ মুডিট ফিল কালার = "# কালারওয়ালু" দিয়ে একটি ভেক্টর ব্যবহার করে দেখুন, কোনও @ রঙের রেফারেন্স ব্যবহার করবেন না কারণ তারা কেবলমাত্র ভেক্টরদের জন্য এসডিকে 21+ কাজ করে (সুতরাং উত্পন্ন পিএনজির জন্য নয়)
পিটারএলস

95

তুমি এটা করতে পার.

তবে আপনি রঙগুলির জন্য রঙিন রেফারেন্স (..্লেম) ব্যবহার করতে পারবেন না, অন্যথায় এটি কেবল এল + এর জন্য কাজ করবে

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
<path
    android:fillColor="#FFAABB"
    android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zm-6,0C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>


11
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! @ কালার রেফারেন্সগুলি ভ্যাক্টরগুলিতে প্রাক-ললিপপ (তাই ভেক্টর -> পিএনজি রূপান্তর) কোড. google.com/p/android/issues/detail?id=186431
পিটারএলসে 25:56

5
@ কালার রেফারেন্সগুলি এখন সমস্ত অ্যান্ড্রয়েড সংস্করণগুলির জন্য ফিল কালার অ্যাট্রিবিউটের জন্য ব্যবহার করা যেতে পারে, তবে এটি রঙের রাজ্যের তালিকাকে সমর্থন করে না।
TheIT

দেখে মনে হচ্ছে ভেক্টর রাজ্যের তালিকাগুলি করার
উপায়টি

1
@ এটিআইটি এটি সক্ষম করতে আমার কী আছে? আমার পক্ষে কাজ করছে বলে মনে হচ্ছে না
urSus

@ পিটারএলস আমি নিশ্চিত নই, আপনি যদি একই সম্পদটি ব্যবহার করতে চান তবে বিভিন্ন ব্যাকগ্রাউন্ডের সাথে (পূর্ববর্তী উত্তরের মতো চিত্রগুলি)। আপনার সমাধানে আপনার একই সংস্থানটির বিভিন্ন উদাহরণ রয়েছে তবে বিভিন্ন পূর্ণ রঙ সহ
অ্যান্টন মকভ

71

অন্যান্য উত্তরে যেমন বলা হয়েছে, ভেক্টর আঁকতে সক্ষম সরাসরি সম্পাদনা করবেন না, পরিবর্তে আপনি জাভা কোডে রঙ করতে পারেন, এর মতো:

    mWrappedDrawable = mDrawable.mutate();
    mWrappedDrawable = DrawableCompat.wrap(mWrappedDrawable);
    DrawableCompat.setTint(mWrappedDrawable, mColor);
    DrawableCompat.setTintMode(mWrappedDrawable, PorterDuff.Mode.SRC_IN);

এবং সরলতার জন্য, আমি একটি সহায়ক শ্রেণি তৈরি করেছি:

import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;

/**
 * {@link Drawable} helper class.
 *
 * @author Filipe Bezerra
 * @version 18/01/2016
 * @since 18/01/2016
 */
public class DrawableHelper {
    @NonNull Context mContext;
    @ColorRes private int mColor;
    private Drawable mDrawable;
    private Drawable mWrappedDrawable;

    public DrawableHelper(@NonNull Context context) {
        mContext = context;
    }

    public static DrawableHelper withContext(@NonNull Context context) {
        return new DrawableHelper(context);
    }

    public DrawableHelper withDrawable(@DrawableRes int drawableRes) {
        mDrawable = ContextCompat.getDrawable(mContext, drawableRes);
        return this;
    }

    public DrawableHelper withDrawable(@NonNull Drawable drawable) {
        mDrawable = drawable;
        return this;
    }

    public DrawableHelper withColor(@ColorRes int colorRes) {
        mColor = ContextCompat.getColor(mContext, colorRes);
        return this;
    }

    public DrawableHelper tint() {
        if (mDrawable == null) {
            throw new NullPointerException("É preciso informar o recurso drawable pelo método withDrawable()");
        }

        if (mColor == 0) {
            throw new IllegalStateException("É necessário informar a cor a ser definida pelo método withColor()");
        }

        mWrappedDrawable = mDrawable.mutate();
        mWrappedDrawable = DrawableCompat.wrap(mWrappedDrawable);
        DrawableCompat.setTint(mWrappedDrawable, mColor);
        DrawableCompat.setTintMode(mWrappedDrawable, PorterDuff.Mode.SRC_IN);

        return this;
    }

    @SuppressWarnings("deprecation")
    public void applyToBackground(@NonNull View view) {
        if (mWrappedDrawable == null) {
            throw new NullPointerException("É preciso chamar o método tint()");
        }

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackground(mWrappedDrawable);
        } else {
            view.setBackgroundDrawable(mWrappedDrawable);
        }
    }

    public void applyTo(@NonNull ImageView imageView) {
        if (mWrappedDrawable == null) {
            throw new NullPointerException("É preciso chamar o método tint()");
        }

        imageView.setImageDrawable(mWrappedDrawable);
    }

    public void applyTo(@NonNull MenuItem menuItem) {
        if (mWrappedDrawable == null) {
            throw new NullPointerException("É preciso chamar o método tint()");
        }

        menuItem.setIcon(mWrappedDrawable);
    }

    public Drawable get() {
        if (mWrappedDrawable == null) {
            throw new NullPointerException("É preciso chamar o método tint()");
        }

        return mWrappedDrawable;
    }
}

ব্যবহার করতে কেবল নিম্নলিখিতটি করুন:

    DrawableHelper
            .withContext(this)
            .withColor(R.color.white)
            .withDrawable(R.drawable.ic_search_24dp)
            .tint()
            .applyTo(mSearchItem);

বা:

    final Drawable drawable = DrawableHelper
            .withContext(this)
            .withColor(R.color.white)
            .withDrawable(R.drawable.ic_search_24dp)
            .tint()
            .get();

    actionBar.setHomeAsUpIndicator(drawable);

হাই ফিলিপ, আপনার উত্তরের জন্য ধন্যবাদ। আপনার কি কোনও লাইব্রেরি আছে, স্নিপড কোড গিথুব রয়েছে যেখানে আমরা লাইসেন্সটি দেখতে পারি? ধন্যবাদ :)
ভিনসেন্ট ডি

2
নাপ ভিসেন্ট, কোনও লাইসেন্স নেই। সমাধানটি এত সহজ যে আমি অনুমান করি যে এখানে ব্যবহৃত বিল্ডার প্যাটার্নটি প্রয়োজনীয় নয়। তবে যে কেউ এই সমাধানের সুবিধা পেতে পারেন এবং লাইসেন্স ছাড়াই ব্যবহার করতে পারেন।
ফিলিপ বেজারেরা দে সুসা

দুর্দান্ত উত্তর! আমার প্রয়োজন মতো ঠিক কাজ করে
ইয়োন

1
@VincentD। এসও ওয়েব পৃষ্ঠার পাদলেখ বলছে, "ব্যবহারকারীদের অবদানগুলি সিসি বাই-সা 3.0 এর অধীন লাইসেন্সের সাথে লাইসেন্সের জন্য প্রয়োজনীয়"
শেল

এটি আমার জন্য কিছু পরিবর্তন নিয়ে কাজ করেছিল। আপনার সাহায্যের জন্য ধন্যবাদ।
আন্দ্রে লুইজ রেইস

36

ভেক্টর চিত্রের রঙ পরিবর্তন করতে আপনি সরাসরি অ্যান্ড্রয়েড ব্যবহার করতে পারেন : tint = "@ color / colorAccent"

<ImageView
        android:id="@+id/ivVectorImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_account_circle_black_24dp"
        android:tint="@color/colorAccent" />

প্রোগ্রামক্রমে রঙ পরিবর্তন করতে

ImageView ivVectorImage = (ImageView) findViewById(R.id.ivVectorImage);
ivVectorImage.setColorFilter(getResources().getColor(R.color.colorPrimary));

getColor () অবচয় করা হয়েছে
ডেভিড

এটি টেক্সটভিউয়ের অঙ্কনযোগ্য *** এর জন্য কীভাবে ব্যবহার করবেন?
হেমন্ত কৌশিক

getColor (ResId) @ ডেভিডকে অবমূল্যায়ন করা হয়েছে, তবে getColor(ResId, Theme)তা নয়। অথবা আপনি ResourcesCompat.getColor(getResources(), R.color.primary, null);থিমটি যত্ন না নিলে ব্যবহার করতে পারেন … বা যদি আপনার প্রসঙ্গ / নীতি প্রতিনিধি কোনও ক্রিয়াকলাপ হয় তবে আপনি getTheme()শেষ প্যারামিটারের জন্য এটি করতে পারেন ।
মার্টিন মার্কনকিনি 21

15

বর্তমানে কর্মরত সলিউশনটি অ্যান্ড্রয়েড: ফিল কালার = "# এফএফএফএফএফএফ"

ভেক্টরে হার্ড কোডিং ছাড়া আমার পক্ষে আর কিছুই কাজ করেনি

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
      android:fillColor="#FFFFFF"
    android:viewportHeight="24.0">
<path
    android:fillColor="#FFFFFF"
    android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zm-6,0C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>

যাইহোক, ভরা রঙ এবং রঙিন খুব শীঘ্রই কাজ করতে পারে। আরও তথ্যের জন্য দয়া করে এই আলোচনা দেখুন:

https://code.google.com/p/android/issues/detail?id=186431

এছাড়াও রঙগুলিতে ক্যাশে লেগে থাকে তাই সমস্ত ব্যবহারকারীদের জন্য অ্যাপ মুছে ফেলা সহায়তা করতে পারে।


7

অ্যান্ড্রয়েড স্টুডিও এখন ভেক্টরদের প্রাক-ললিপপ সমর্থন করে। কোনও পিএনজি রূপান্তর নেই। আপনি এখনও আপনার পূরণের রঙ পরিবর্তন করতে পারেন এবং এটি কার্যকর হবে।

আপনার ইমেজভিউতে, ব্যবহার করুন

 app:srcCompat="@drawable/ic_more_vert_24dp"

আপনার গ্রেড ফাইল,

 // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
 }  

 compile 'com.android.support:design:23.4.0'

10
প্রশ্নটি "কীভাবে ভেক্টর পূরণের রঙ পরিবর্তন করবেন", "কীভাবে ভেক্টর সম্পদ ব্যবহার করবেন" নয়
লিও ড্রয়েডকোডার

5

হালনাগাদ: AppCompat সমর্থন

সন্দেহযুক্ত অন্যান্য উত্তরগুলি android:tintকেবলমাত্র 21+ ডিভাইস, অ্যাপকম্প্যাট ( v23.2.0 এবং উপরে ) এ কাজ করবে কিনা এখন রঙিন বৈশিষ্ট্যের পিছনে সামঞ্জস্যপূর্ণ হ্যান্ডলিং সরবরাহ করে।

সুতরাং, ক্রিয়াকলাপটি এর পরিবর্তে ব্যবহার AppCompatImageViewএবং app:srcCompat(অ্যাপকম্প্যাট নেমস্পেসে) হবেandroid:src (অ্যান্ড্রয়েড নেমস্পেস) এর ।

এখানে একটি উদাহরণ রয়েছে (অ্যান্ড্রয়েডএক্স: এটি অ্যান্ড্রয়েড.অ্যাপকম্প্যাট.উইজেটঅ্যাপকম্প্যাট আইমেজভিউ ;)):

<android.support.v7.widget.AppCompatImageView
        android:id="@+id/credits_material_icon"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="16dp"
        android:layout_marginStart="16dp"
        android:scaleType="fitCenter"
        android:tint="#ffd2ee"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:srcCompat="@drawable/ic_dollar_coin_stack" />

এবং গ্রেডে ভেক্টর অঙ্কনযোগ্য সমর্থন সক্ষম করতে ভুলবেন না:

vectorDrawables.useSupportLibrary = true 

শুধু একটি আপডেট। আজকাল এর AppCompatImageViewঅধীনে রয়েছেandroidx.appcompat.widget.AppCompatImageView
রোক বোরোনাত

2

পুরানো অ্যান্ড্রয়েড ডিভাইসগুলিতে রঙিন ভেক্টর আঁকতে সক্ষম করতে এই লাইব্রেরিকে গ্রেডলে যুক্ত করুন।

compile 'com.android.support:palette-v7:26.0.0-alpha1'

এবং পুনরায় সিঙ্ক গ্রেড। আমি মনে করি এটি সমস্যার সমাধান করবে।


2

যদি ভেক্টরগুলি ফিল কালার ব্যবহার করে স্বতন্ত্রভাবে রঙ সেট করে না দেখায় তবে সেগুলি ডিফল্ট উইজেট পরামিতিতে সেট করা হতে পারে।

app:itemIconTint="@color/lime"উইজেট আইকনগুলির জন্য একটি ডিফল্ট রঙ প্রকার সেট করতে गतिविधि_main.xML এ যুক্ত করার চেষ্টা করুন Try

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:itemIconTint="@color/lime"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

ভেক্টরড্র্যায়েবল @ বিকাশকারী.অ্যান্ড্রয়েড


অ্যান্ড্রয়েড স্টুডিওতে এসভিজি এক্সএমএল-এ এই ক্ষেত্রের 3.6 পরিবর্তন: অ্যান্ড্রয়েড: ফিল কালার = "# এফএফএফএফসি 400"
এ_সুবস্ক্রাইবার

1

আপনি যদি পুরানো সংস্করণ প্রি ললিপপ সমর্থন করেন look

কিছু পরিবর্তন সহ একই xML কোড ব্যবহার করুন

স্বাভাবিকের পরিবর্তে ImageView --> AppCompatImageView

পরিবর্তে android:src --> app:srcCompat

এখানে উদাহরণ

<android.support.v7.widget.AppCompatImageView
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:id="@+id/button"
        app:srcCompat="@drawable/ic_more_vert_24dp"
        android:tint="@color/primary" />

@ সাইজ ভালসানের উল্লেখ হিসাবে আপনার গ্রেড আপডেট করবেন না

// Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
 }  

 compile 'com.android.support:design:23.4.0'

নোটিশ যে কোনও একটিকে ভেক্টর ব্যবহার করুন কখনও কখনও আপনার ভেক্টরটিকে রঙের মতো উল্লেখটি কখনও android:fillColor="@color/primary"তার সদৃশ মান দেয় না।


কেন কখনও ব্যবহার @colorকরবেন না fillcolor?
হোসেইনিট

0

যারা এটি ব্যবহার করেন না তাদের ImageViewজন্য নীচেরগুলি আমার জন্য একটি সমভূমিতে কাজ করেছিল View(এবং তাই আচরণটি যে কোনও ধরণের দৃশ্যে প্রতিলিপি করা উচিত)

<View
    android:background="@drawable/ic_reset"
    android:backgroundTint="@color/colorLightText" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.