কীভাবে আকারের রঙ পরিবর্তনশীল?


136

আমার আছে

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
    <solid
       android:color="#FFFF00" />
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
</shape>

<TextView
    android:background="@drawable/test"
    android:layout_height="45dp"
    android:layout_width="100dp"
    android:text="Moderate"
/>

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

আমি কীভাবে আকৃতির রঙ পরিবর্তন করতে পারি? এই তথ্যের ভিত্তিতে?


3
@Couitchy পদ্ধতি দ্বারা নিযুক্ত হিসাবে View.getBackground()আয় একটি GradientDrawableএবং একটি না ShapeDrawableঅ্যাপ্লিকেশন ঘটাচ্ছে যখন রেফারেন্স পেতে এবং রঙ প্রোগ্রামেটিক্যালি সেট আপের চেষ্টা করার অবৈধ ঢালাই কারণে রানটাইম এ ক্র্যাশ করতে পারে। [অ্যান্ড্রয়েড শেপ ডক] ( বিকাশকারী.অ্যান্ড্রয়েড. com/guide / টপিক্স / রিসোর্স /GradientDrawable )) বলেছেন: সমাপ্ত রিসোর্স তারিখ: একটিতে রিসোর্স পয়েন্টার
লুইস কুইজাদা

উত্তর:


300

আপনি এটি সহজভাবে এটি পরিবর্তন করতে পারেন

GradientDrawable bgShape = (GradientDrawable)btn.getBackground();
bgShape.setColor(Color.BLACK);

9
বিটিএন.জেটব্যাকগ্রাউন্ড কী?
চাবো 2

16
java.lang.ClassCastException: android.graphics.drawable.GradientDrawable cannot be cast to android.graphics.drawable.ShapeDrawableএই পরামর্শটি চেষ্টা করার সময় আমি পাচ্ছি ।
prolink007

2
কাজ করে না. আপনি একটি castালাই ত্রুটি পাবেন। একটি স্থির বা অন্য উত্তর গৃহীত দরকার
ndgreen

6
এটি ঠিক কাজ করে। উত্তরটি সম্পাদিত হওয়ার পরে আগের মন্তব্যগুলি পুরানো!
W3hri

4
shoul গ্র্যাডিয়েন্টড্রেইবল বিগ শাপ = (গ্রেডিয়েন্টড্রেইবল) বিটিএন.সেটব্যাকগ্রাউন্ড ()। গেটকন্টেন্ট ();
নাভিদ 148

60

আমার জন্য, এটি ক্র্যাশ হয়েছিল কারণ getBackgroundএকটি এর GradientDrawableপরিবর্তে একটি ফিরে পেয়েছিল ShapeDrawable

সুতরাং আমি এটিকে এটির মতো পরিবর্তন করেছি:

((GradientDrawable)someView.getBackground()).setColor(someColor);

42

এটি প্রাথমিক xML সংস্থান সহ আমার পক্ষে কাজ করে:

example.setBackgroundResource(R.drawable.myshape);
GradientDrawable gd = (GradientDrawable) example.getBackground().getCurrent();
gd.setColor(Color.parseColor("#000000"));
gd.setCornerRadii(new float[]{30, 30, 30, 30, 0, 0, 30, 30});
gd.setStroke(2, Color.parseColor("#00FFFF"), 5, 6);

উপরের ফলাফল: http://i.stack.imgur.com/hKUR7.png


এটা সঠিক উত্তর. উপরোক্ত উত্তর দুটি উত্তরই আমার পক্ষে কার্যকর হয়নি for আমি এটি উভয়ই ব্যতিক্রম পাচ্ছি।
সানাল ভার্গেস

10

আপনি জাভাতে নিজের আকার তৈরি করতে পারেন। পেজ কনট্রোলারের মতো আইফোনের জন্য আমি এটি করেছি এবং জাভাতে আকারগুলি আঁকলাম:

/**
 * Builds the active and inactive shapes / drawables for the page control
 */
private void makeShapes() {

    activeDrawable = new ShapeDrawable();
    inactiveDrawable = new ShapeDrawable();
    activeDrawable.setBounds(0, 0, (int) mIndicatorSize,
            (int) mIndicatorSize);
    inactiveDrawable.setBounds(0, 0, (int) mIndicatorSize,
            (int) mIndicatorSize);

    int i[] = new int[2];
    i[0] = android.R.attr.textColorSecondary;
    i[1] = android.R.attr.textColorSecondaryInverse;
    TypedArray a = this.getTheme().obtainStyledAttributes(i);

    Shape s1 = new OvalShape();
    s1.resize(mIndicatorSize, mIndicatorSize);
    Shape s2 = new OvalShape();
    s2.resize(mIndicatorSize, mIndicatorSize);

    ((ShapeDrawable) activeDrawable).getPaint().setColor(
            a.getColor(0, Color.DKGRAY));
    ((ShapeDrawable) inactiveDrawable).getPaint().setColor(
            a.getColor(1, Color.LTGRAY));

    ((ShapeDrawable) activeDrawable).setShape(s1);
    ((ShapeDrawable) inactiveDrawable).setShape(s2);
}

আশাকরি এটা সাহায্য করবে. গ্রিজ ফ্যাবিয়ান


7

আমার প্রয়োজন মতো একাধিক অঙ্কনযোগ্য তৈরি না করে অন্য কারও জন্য এক্সএমএলে রঙ পরিবর্তন করতে হবে। তারপরে রঙ ছাড়াই একটি বৃত্ত আঁকতে সক্ষম করুন এবং তারপরে চিত্রকল্পের জন্য ব্যাকগ্রাউন্ডটাইন্ট নির্দিষ্ট করুন।

circle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
</shape>

এবং আপনার বিন্যাসে :

<ImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@drawable/circle"
    android:backgroundTint="@color/red"/>

সম্পাদনা:

এই পদ্ধতি সম্পর্কিত একটি বাগ রয়েছে যা এটিকে অ্যান্ড্রয়েড ললিপপ 5.0 (এপিআই স্তর 21) এ কাজ করা থেকে বিরত করে। তবে নতুন সংস্করণে স্থির করা হয়েছে।


5
    LayerDrawable bgDrawable = (LayerDrawable) button.getBackground();
    final GradientDrawable shape = (GradientDrawable)
            bgDrawable.findDrawableByLayerId(R.id.round_button_shape);
    shape.setColor(Color.BLACK);

গোল_বুটন_শ্যাপিটি xML ফাইলের আকারে কোথায় সংজ্ঞায়িত করা উচিত?
জয়েশ

5

বৃত্ত.এক্সএমএল (অঙ্কনযোগ্য)

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<solid
    android:color="#000"/>

<size
    android:width="10dp"
    android:height="10dp"/>
</shape>

বিন্যাস

<ImageView
      android:id="@+id/circleColor"
      android:layout_width="15dp"
       android:layout_height="15dp"
      android:textSize="12dp"
       android:layout_gravity="center"
       android:layout_marginLeft="10dp"
      android:background="@drawable/circle"/>

ক্রিয়াকলাপে

   circleColor = (ImageView) view.findViewById(R.id.circleColor);
   int color = Color.parseColor("#00FFFF");
   ((GradientDrawable)circleColor.getBackground()).setColor(color);

নিখুঁত নয়, তবে সমাধান পেতে আমাকে সহায়তা করেছেন।
রকেশ যাদব

2

এই সমাধানটি অ্যান্ড্রয়েড এসডিকে ভি 19 ব্যবহার করে আমার জন্য কাজ করেছে:

//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);

//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();

//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)

2

আপনার যদি এই মত একটি চিত্র দেখুন:

   <ImageView
    android:id="@+id/color_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="10dp"
    android:src="@drawable/circle_color"/>

যা এটি এসসিআর হিসাবে একটি আকর্ষণীয় আকার দেয়, আপনি এই কোডটি আকারের রঙ পরিবর্তন করতে ব্যবহার করতে পারেন:

ImageView iv = (ImageView)findViewById(R.id.color_button);
GradientDrawable bgShape = (GradientDrawable)iv.getDrawable();
bgShape.setColor(Color.BLACK);

1

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

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid  android:color="@android:color/transparent" />
<stroke android:width="0.5dp" android:color="@android:color/holo_green_dark"/>
</shape>

আমার ক্রিয়াকলাপ এক্সএমএল:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="cn.easydone.test.MainActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
    <TextView
        android:id="@+id/test_text"
        android:background="@drawable/bg_stroke_dynamic_color"
        android:padding="20dp"
        android:text="asdasdasdasd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.design.widget.AppBarLayout>

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

আমার ক্রিয়াকলাপ জাভা:

 TextView testText = (TextView) findViewById(R.id.test_text);
 ((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK);

ফলাফলের চিত্র: ফলাফল


1

ব্যাসার্ধ দিয়ে আকৃতিটি পূরণ করার সহজ উপায় হ'ল:

এক্সএমএল:

<TextView
    android:id="@+id/textView"
    android:background="@drawable/test"
    android:layout_height="45dp"
    android:layout_width="100dp"
    android:text="Moderate"/>

জাভা:

(textView.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);

0

আমি রনির উত্তরটি চেষ্টা করে দেখি এবং আমার অ্যাপটি ক্র্যাশ হয়ে গেছে। তারপরে আমি আমার অঙ্কনযোগ্য এক্সএমএল চেক করি। দেখে মনে হচ্ছে:

<selector >...</selector>

। আমি এটিতে এটি পরিবর্তন করেছি: (বৈশিষ্ট্যগুলিও পরিবর্তিত হয়েছে)

<shape> ... </shape>

এটা কাজ করে।

যারা একই সমস্যা সম্মুখীন হয়।


0

drawable_rectangle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="@android:color/transparent" />

    <stroke
        android:width="1dp"
        android:color="#9f9f9f" />

    <corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp" />

</shape>

TextView

<androidx.appcompat.widget.AppCompatTextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/drawable_rectangle"
    android:gravity="center"
    android:padding="10dp"
    android:text="Status"
    android:textColor="@android:color/white"
    android:textSize="20sp" />


public static void changeRectangleColor(View view, int color) {
    ((GradientDrawable) view.getBackground()).setStroke(1, color);
}    

changeRectangleColor(textView, ContextCompat.getColor(context, R.color.colorAccent));

0

এটি অর্জনের জন্য আপনি একটি বন্ডিং অ্যাডাপ্টার (কোটলিন) ব্যবহার করতে পারেন । নীচের মত চেঞ্জশেপ কালার নামে একটি বাঁধাই অ্যাডাপ্টার শ্রেণি তৈরি করুন

@BindingAdapter("shapeColor")

// Method to load shape and set its color 

fun loadShape(textView: TextView, color: String) {
// first get the drawable that you created for the shape 
val mDrawable = ContextCompat.getDrawable(textView.context, 
R.drawable.language_image_bg)
val  shape =   mDrawable as (GradientDrawable)
// use parse color method to parse #34444 to the int 
shape.setColor(Color.parseColor(color))
 }

রেজ / ড্রয়যোগ্য ফোল্ডারে অঙ্কনযোগ্য আকার তৈরি করুন। আমি একটি বৃত্ত তৈরি করেছি

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<solid android:color="#anyColorCode"/>

<size
    android:width="@dimen/dp_16"
    android:height="@dimen/dp_16"/>
</shape>

অবশেষে এটি আপনার দর্শনে উল্লেখ করুন

  <TextView>
   .........
  app:shapeColor="@{modelName.colorString}"
 </Textview>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.