অ্যান্ড্রয়েড রেটিংবার বার পরিবর্তিত তারা রঙগুলি [বন্ধ]


141

আমি কীভাবে তারার রং এবং তারার আকার পরিবর্তন করতে পারি?


আমি মনে করি আপনি যদি এটি করতে চান তবে আপনার নিজের কাস্টম রেটিং বার তৈরি করতে হবে
ডোনাল রাফার্টি

আমি রেটিংবার বারের চিত্রগুলি কীভাবে পরিবর্তন করতে হবে তা বর্ণনা করে একটি ব্লগ পোস্ট লিখেছিলাম: kozyr.zydako.net/2010/05/23/ ব্যাখ্যাtyratingbar এটি আপনাকে চিত্রের আকার নির্দিষ্ট করতে পারে কোথায় তা দেখায় ...
কোজির

আমি আশা করছিলাম যে এই প্রশ্নটি বহু বর্ণযুক্ত রেটিং বারের জন্য ওয়েবসাইটগুলিতে দেখানো হয়েছে, নিজের জন্য একটি খুঁজে পেল না। একটি সাধারণ বাস্তবায়ন নিজেই তৈরি করেছেন github.com/codebreaker/coloredratingbar- android । আশা করছি এটা ওখানে কাওকে সাহায্য করবে.
জাগা

উত্তর:


26

পদক্ষেপ # 1: বিদ্যমান শৈলীর একটি ক্লোন করে (নিজের থেকে $ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml) এটি আপনার নিজের প্রকল্পের মধ্যে রেখে styles.xmlএবং আপনি যখন কোনও বিন্যাসে উইজেট যুক্ত করেন তখন তা উল্লেখ করে আপনার নিজস্ব শৈলী তৈরি করুন ।

পদক্ষেপ # 2: বারের জন্য উপযুক্ত চিত্রগুলিতে ইঙ্গিত করে এর LayerDrawableজন্য আপনার নিজস্ব এক্সএমএল সংস্থান তৈরি করুন RatingBar। মূল শৈলীগুলি আপনাকে বিদ্যমান সংস্থানগুলিতে নির্দেশ করবে যা আপনি তুলনা করতে পারেন। তারপরে, LayerDrawableবিল্ট-ইনগুলি না করে নিজের সংস্থানগুলি ব্যবহার করতে আপনার স্টাইলকে সামঞ্জস্য করুন ।


1
পদক্ষেপ # 2 অনুসারে, এটি স্যামসাং 3 ডিভাইস বা কিছু অন্যদের জন্য কাজ করে না, এটি লেয়ারড্রেবলযোগ্য হওয়ার দরকার নেই। তথ্যের জন্য এখানে দেখুন: stackoverflow.com/questions/30266334/…
কেনি

6
অ্যান্ড্রয়েড ব্যবহার করুন: প্রগতিচিন্তা = "@ রঙ / হলুদ"। @ সুপারপুসিওর উত্তর দেখুন।
ভিনসেন্ট

2
প্রগ্রেসটাইন্টটি 21 এপিআই স্তরের উপরে সমর্থিত
যোগেশ রাঠি


120

এটি উল্লিখিত ব্লগে কিছুটা জটিল, আমি অনুরূপ তবে সহজ উপায় ব্যবহার করেছি। আপনার জন্য তিনটি তারা চিত্র (red_star_full.png, red_star_half.png এবং red_star_empty.png) এবং একটি এক্সএমএল দরকার, এটিই যথেষ্ট।

এই 3 টি চিত্রকে পুনরায় / আঁকতে সক্ষম করুন।

নিম্নলিখিত রেটিংবার_red.xml সেখানে রাখুন:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background" android:drawable="@drawable/red_star_empty" />
    <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/red_star_half" />
    <item android:id="@android:id/progress" android:drawable="@drawable/red_star_full" />
</layer-list>

এবং, অবশেষে, এটি ব্যবহার করতে আপনার রেটিংবার সংজ্ঞাটি বলুন

<RatingBar android:progressDrawable="@drawable/ratingbar_red"/>

এটাই.


3
হাই অ্যালেক্স, আমি এই সমাধানটি চেষ্টা করেছি কিন্তু যখন আমি রেটিংটি 1.1, 1.2, ইত্যাদির মতো সেট করার চেষ্টা করি ... এটি 1.5 হিসাবে প্রদর্শিত হয়। আমি 3 তারা চিত্র নিয়েছি, একটি খালি, অর্ধেক পূর্ণ এবং একটি পূর্ণ। আমি অনুমান করি যে ভগ্নাংশের উপাদানগুলি পেতে তাদের মধ্যে বিভক্ত হওয়ার কথা, আমি ভাবছি যে অন্য কারও একই সমস্যা হয়েছে বা আমি লক্ষণীয় কিছু ভুল করছি?
গ্রাহাম বাইটসন

আপনি দয়া করে আমাকে যে চিত্রগুলি আবহাওয়া ব্যবহার করা উচিত সেগুলি সম্পর্কে একটি বর্ণিত চিত্র এবং আকারের চিত্রগুলি এটি সমাধান করতে সক্ষম না হওয়ায় দয়া করে আমাকে তা জানান ...
পৃথ্বীরাজ শিরূর ২

1
প্রত্যেকে নীচে দেখুন যে 2015 আপডেট উত্তর! এটি অনেক সহজ এবং সহজ!
কেটি

এই উত্তরটি এখনও তারার বিভিন্ন রাজ্যের উপর আরও নমনীয়তা সরবরাহ করে।
টম ব্রিংক্যাম্পার

আমি তারার নীচে উল্লম্ব লাইন পাচ্ছি কেন? আমি কাস্টম স্টাইলটি সংজ্ঞায়িত করার চেষ্টা করেছি, উচ্চতা উল্লেখ করেছিলাম, তবে এখনও আমার AVD- র নীচে উল্লম্ব রেখা রয়েছে।
আলেকসান্দার

93

আপনি যদি রঙ পরিবর্তন করতে চান তবে এটি ব্যবহার করুন:

RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar);
LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable();
stars.getDrawable(2).setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_ATOP);

1
এর PorterDuff.Mode.SRC_ATOPঅর্থ কি বা আসলে?
Zapnologica

5
এপিআই 5.0 এবং তার বেশি কাজ করে না। প্রয়োজন:Drawable stars = rb.getProgressDrawable(); stars.setTint( Color.YELLOW );
zyamys

@zyamys এটি সত্যিই সফল হয় = ("উচ্চতর সংস্করণগুলির জন্য একটি পদ্ধতি এবং পুরানো সংস্করণগুলির জন্য অন্য একটি পদ্ধতি প্রয়োজনীয়?
ড্যানিয়েলা মোরিস

1
এটি কেবল ০.০ এর নির্ভুলতার জন্য কাজ করে। অন্যথায় (যথাযথ <0.5) ওভারলেটি অদ্ভুত হয়ে যায় এবং মনে হয় নীল বর্ণটি এখনও 0.5 এর সূক্ষ্মতার সাথে রয়েছে এবং হলুদটি সুনির্দিষ্ট
Teo Inke

1
সতর্কতা: প্রাক-ললিপপ ডিভাইসে ক্রাশ। গৃহীত উত্তর সহ যান।
ব্লকওয়ালা

70

আমার পক্ষে কাজ করা সবচেয়ে সহজ উপায় ... আপনি যদি অ্যাপকম্প্যাট ক্রিয়াকলাপটি প্রসারিত করেন

আপনার বিল্ড.gradle এ সর্বশেষ অ্যাপকম্প্যাট লাইব্রেরি যুক্ত করুন।

dependencies {  
    compile 'com.android.support:appcompat-v7:X.X.X' // where X.X.X version
}

আপনার ক্রিয়াকলাপটি android.support.v7.app.appCompatActivity প্রসারিত করুন

public class MainActivity extends AppCompatActivity {  
    ...
}

আপনার স্টাইলস.এমএমএল ফাইলটিতে কাস্টম শৈলীর ঘোষণা দিন।

<style name="RatingBar" parent="Theme.AppCompat">  
    <item name="colorControlNormal">@color/indigo</item>
    <item name="colorControlActivated">@color/pink</item>
</style>  

এই স্টাইলটি আপনার রেটিংবারে অ্যান্ড্রয়েড: থিম বৈশিষ্ট্যের মাধ্যমে প্রয়োগ করুন।

<RatingBar  
    android:theme="@style/RatingBar"
    android:rating="3"
    android:stepSize="0.5"
    android:numStars="5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

3
ধন্যবাদ @ વિશাল কুমার। আমি এটি Kitkat 4.4.4 (Samsung S3 neo) এবং মার্শমালো 6.0.1 (স্যামসং গ্যালাক্সি অন এনএসটি) এ চেষ্টা করেছি, এটি কাজ করেছিল। তবে ললিপপ 5.1 (মাইক্রোম্যাক্স) এ কোনও সাফল্য পাওয়া যায়নি। ললিপপের জন্য আমি রেটিংবারে "অ্যান্ড্রয়েড: প্রগ্রেসটাইন্ট" বৈশিষ্ট্যটি ব্যবহার করেছি এবং হ্যাঁ এটি কার্যকর হয়।
প্রশান্ত

এটিই সেরা সমাধান।
আরহাত বাইদ

এটি নির্বাচিত সঠিক উত্তর হওয়া উচিত।
হাম্পেল এলিড

1
এটিই সেরা সমাধান। আপনি যদি তারার আকার পরিবর্তন করতে চান তবে আপনি style="?android:ratingBarStyleSmall"একসাথে ব্যবহার করতে পারেন ।
আন্দ্রে লুইজ রেইস

@ অ্যান্ড্রুলুইজ রিস <style name="RatingBarSmallTheme" parent="Theme.AppCompat"> <item name="colorControlNormal">@color/colorOrangeNormal</item> <item name="colorControlActivated">@color/colorOrangeActivated</item> <item name="ratingBarStyle">@style/Widget.AppCompat.RatingBar.Small</item> </style> এবং আপনার রেটিংবারandroid:theme="@style/RatingBarSmallTheme"
জাকার

47

2015 আপডেট

আপনি এখন সব ধরণের অঙ্কনীয় ছাঁটাই করতে ড্রইবল কমপ্যাট ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

Drawable progress = ratingBar.getProgressDrawable();
DrawableCompat.setTint(progress, Color.WHITE);

এটি পিছু পিছু পিছু পিছু এডিআই 4


রেটিংবারে অঙ্কনযোগ্যটিকে পিছনে সেট করতে ভুলবেন না।

15
এটি পুরো অঙ্কনযোগ্যকে এক রঙে ছিনিয়ে দেয় যা খালি তারার পার্থক্য করতে খুব শক্ত করে।
নীলনক

এটি কেবল অ্যান্ড্রয়েড সমর্থন লাইব্রেরি> = 22 নিয়ে কাজ করে এবং সমর্থন লাইব্রেরি <22 এর সাথে নয়।
রাঘব শর্মা

2
এটি 3.5 বর্ণের নয়, 5 রঙিন তারা আঁকবে।
কুলমাইন্ড

1
আমি কেবল if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {}এটিকে ঘিরে রাখব যেহেতু এটি এপিআই 22 থেকে ডিফল্টরূপে কাজ করছে
ইয়োন হারকিউট

38

এটিআইপি 21 থেকে এই তিনটি লাইনের কোডের সাথে তারার রঙ পরিবর্তন করা খুব সহজ:

android:progressTint="@android:color/holo_red_dark"
android:progressBackgroundTint="@android:color/holo_red_dark"
android:secondaryProgressTint="@android:color/holo_red_dark" 

এটি এইভাবে করা, আপনি পরিবর্তন করবেন:

  • ভরা স্টার রঙ (অগ্রগতি
  • অসম্পূর্ণ তারার রঙ (অগ্রগতি ব্যাকগ্রাউন্ডটিন্ট)
  • এবং তারার সীমানা বর্ণ (গৌণপ্রোগ্রিটসিন্ট)

3.5 এর পরিবর্তে এটি 4 টি তারা আঁকা।
কুলমাইন্ড

@ কুলমাইন্ড অ্যান্ড্রয়েড সেট করুন: স্টেপ সাইজ: 0.5 এর পরিবর্তে 1
ইলিমেন্ট

4
খালি তারার রঙ কীভাবে পরিবর্তন করবেন?
উইংকলার

@Winklerrr আপনি কীভাবে খালি তারার রঙ পরিবর্তন করতে পারেন তার সমাধান খুঁজে পেয়েছেন।
তরুণ কুমার

কোনও সমাধান খুঁজে পেতে আরও চেক করেনি
উইংকলার

36

আপনি যদি তারকাদের রঙ পরিবর্তন করতে চান তবে আমার ব্যবহারটি আপনাকে জানিয়েছে:

LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable();
stars.getDrawable(2).setColorFilter(getResources().getColor(R.color.starFullySelected), PorterDuff.Mode.SRC_ATOP);
stars.getDrawable(1).setColorFilter(getResources().getColor(R.color.starPartiallySelected), PorterDuff.Mode.SRC_ATOP);
stars.getDrawable(0).setColorFilter(getResources().getColor(R.color.starNotSelected), PorterDuff.Mode.SRC_ATOP);

ডাটাবেস থেকে প্রাপ্ত তথ্যের ভিত্তিতে তারকাদের রঙ সেট করার কোনও উপায় আছে কি? আসুন আমি পেয়েছিলাম 5 তারার এবং তথ্য ডাটাবেস থেকে ফিরে 4. সুতরাং পরিবর্তে সব 5 পরিবর্তন, আমি শুধুমাত্র প্রথম 4 পরিবর্তন ছিল বলে

1
getColor এখন অবহেলিত হয়, কোন বিকল্প?
মনোহর রেড্ডি

2
আপনি এখানে উত্তর খুঁজে পেতে পারেন stackoverflow.com/a/32202256/2513291 উদাহরণস্বরূপ এই পদ্ধতির ContextCompat.getColor (কনটেক্সট, R.color.color_name)
Yuriy Vinogradov

ভাল কাজ করে তবে লক্ষ্য করুন যে কোনও কারণে আদেশটি গুরুত্বপূর্ণ (২, তারপরে ১, তারপরে 0)। আমি বিপরীতটি চেষ্টা করেছিলাম এবং এটি রঙটি প্রথমবার পরিবর্তন হওয়ার পরে কিছু ইউআই গ্লিটকে নিয়ে যায়।
সাইমন নিনন

25

অ্যালেক্স এবং কমন্স ওয়ারেস যে সমাধানগুলি পোস্ট করেছে তা সঠিক। অ্যানড্রয়েড যে জিনিসটির বিষয়ে কখনও আলোচনা করে না তা বিভিন্ন ঘনত্বের জন্য সঠিক পিক্সেল আকার। হ্যালো আলোর উপর ভিত্তি করে প্রতিটি ঘনত্বের জন্য প্রয়োজনীয় মাত্রা এখানে রয়েছে।

ছোট তারা

mdpi: 16px
hdpi: 24px
xhdpi: 32px
xxhdpi: 48px

মাঝারি তারা

mdpi: 24px
hdpi: 36px
xhdpi: 48px
xxhdpi: 72px

বড় স্টার

mdpi: 35px
hdpi: 52px
xhdpi: 69px
xxhdpi: 105px

আমি কি তারকাদের সাথে ভেক্টরড্রাবল ব্যবহার করতে পারি
মিনা

24

সুতরাং আমি এই সমস্যাটি নিয়ে দুই ঘন্টা ধরে লড়াই করে যাচ্ছি এবং আমি সমস্ত এপিআই সংস্করণগুলির জন্য কার্যনির্বাহী সমাধান নিয়ে এসেছি, যেখানে অর্ধেক তারা রেটিংগুলিও দেখানো হয়েছে।

private void setRatingStarColor(Drawable drawable, @ColorInt int color)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        DrawableCompat.setTint(drawable, color);
    }
    else
    {
        drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
}

আপনি অঙ্কনযোগ্য এই ক্রম সঙ্গে পদ্ধতি কল:

    LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable();
    // Filled stars
    setRatingStarColor(stars.getDrawable(2), ContextCompat.getColor(getContext(), R.color.foreground));
    // Half filled stars
    setRatingStarColor(stars.getDrawable(1), ContextCompat.getColor(getContext(), R.color.background));
    // Empty stars
    setRatingStarColor(stars.getDrawable(0), ContextCompat.getColor(getContext(), R.color.background));

দ্রষ্টব্য: এছাড়াও আপনাকে অবশ্যই এক্সএমএলে "সর্বাধিক" এবং "numStars" বৈশিষ্ট্যগুলি নির্দিষ্ট করতে হবে, অন্যথায় অর্ধ তারা দেখানো হয় না।


একমাত্র উপায় যে API19 উপর আমার জন্য কাজ করে, কিন্তু আমি আপ একটি উপায় জন্য চেহারা XML শুধুমাত্র T_T থেকে এই কাজ দেওয়া আছে
Beeing Jk

@ বিয়িংজেইকে আপনি যদি এমন একটি কাস্টম ভিউ তৈরি করেন যা রেটিংবারকে প্রসারিত করে তবে আপনি রঙের রঙ নির্দিষ্ট করতে নিজস্ব এক্সএমএল বৈশিষ্ট্য তৈরি করতে পারেন। তারপরে টিন্টটি সেট করার জন্য আপনার একক পয়েন্ট নিয়ন্ত্রণ থাকতে পারে এবং xML- এ রঙটি নির্দিষ্ট করতে পারে। আশা করি এইটি কাজ করবে! প্রয়োজনে আরও ব্যাখ্যা করতে পারেন
ফরেস্ট বাইস

Mode.SRC_INবা Mode.MULTIPLY?
ডাঃ জ্যাকি

12

এখন আপনি ব্যবহার করতে পারেন DrawableCompat অগ্রে AppCompat v22.1.0 থেকে যখন আপনি অঙ্কনযোগ্য একটি একক সেট দিয়ে একাধিক থিম সমর্থন করছি পরিবর্তনশীল অঙ্কনযোগ্য, দরকারী সব ধরনের আভা করতে। উদাহরণ স্বরূপ:

LayerDrawable layerDrawable = (LayerDrawable) ratingBar.getProgressDrawable();
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)), Color.RED);   // Empty star
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)), Color.GREEN); // Partial star
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)), Color.BLUE);  // Full star

এটি পিছু পিছু পিএসআই 4 এর সাথে সামঞ্জস্যপূর্ণ এছাড়াও সাপোর্ট লাইব্রেরি ভি 22.1.0 এ ক্রিস বেনসের ব্লগ পোস্টটি দেখুন

প্রকৃত আকার এবং আকারের জন্য আপনাকে উপযুক্ত আকারের জন্য একটি নতুন শৈলী এবং স্তর-তালিকা ড্রয়যোগ্যগুলি সংজ্ঞায়িত করতে হবে, যেমন অন্যরা ইতিমধ্যে উপরে উত্তর দিয়ে গেছে।


ড্রয়যোগ্যরা অ্যারে নয় কীভাবে আপনি অগ্রগতি অ্যাক্সেস করছেন [0]?
ব্লুওয়াইস

@ ব্লুয়াইস আপনি ঠিক বলেছেন দুঃখিত, অঙ্কনযোগ্য একটি স্তরচিকিত্সা হওয়া উচিত, এখনই সংশোধন করা হয়েছে, ধন্যবাদ।
ড্যান ডার 3

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

পরিবর্তে রঙ পরিবর্তনযোগ্য কীভাবে পরিবর্তন করবেন?
ইমান মারাশী

@ ইমানমারাশি উপরের অ্যালেক্সের এক্সএমএল ভিত্তিক উত্তরটি দেখুন, লেয়ারড্র্যাবেবল.সেটড্রেবল (সূচক, অঙ্কনযোগ্য) কেবলমাত্র এপিআই 23 এর পরে উপলব্ধ।
ড্যান ডার 3

10

android:themeবৈশিষ্ট্য ব্যবহার করুন :

styles.xml

<style name="Theme.Rating" parent="Theme.AppCompat.Light">
    <item name="colorAccent">@color/rating</item>
</style>

layout.xml

<android.support.v7.widget.AppCompatRatingBar
    android:theme="@style/Theme.Rating"
    android:numStars="5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

9

এক্সএমএল থেকে কেবল রেটিং বারের রঙ পরিবর্তন করার জন্য: -

android:progressTint="@color/your_color"
android:backgroundTint="@color/your_color"
android:secondaryProgressTint="@color/your_color"

এটি খালি তারার রঙ পরিবর্তন করে না
নৈনাল

7

রঙ পরিবর্তন করতে আপনাকে কেবল অ্যান্ড্রয়েডের প্যারামিটারটি সেট করতে হবে: প্রগ্রেসটাইন্ট

 <RatingBar
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="15dp"
        android:numStars="5"
        android:rating="1"
        android:progressTint="@android:/color/black"
        android:layout_gravity="center"
       />

আকারের জন্য স্টাইলের সম্পত্তি।


শুধুমাত্র 21 বা
জুনেদ


4

বিল্ডিং @ lgvalle এর উত্তর।

2015 আপডেট

আপনি এখন সব ধরণের অঙ্কনীয় ছাঁটাই করতে ড্রইবল কমপ্যাট ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

অঙ্কনযোগ্য অগ্রগতি = रेटिंगBar.getProgressDrawable (); DrawableCompat.setTint (অগ্রগতি, রঙ। WHITE); এটি পিছু পিছু পিছু পিছু এডিআই 4

LayerDrawable drawable = (LayerDrawable) getProgressDrawable();
Drawable progress = drawable.getDrawable(2);
DrawableCompat.setTint(progress, getResources().getColor(COLOR1));
progress = drawable.getDrawable(1);
DrawableCompat.setTintMode(progress, PorterDuff.Mode.DST_ATOP);
DrawableCompat.setTint(progress, getResources().getColor(COLOR1));
DrawableCompat.setTintMode(progress, PorterDuff.Mode.SRC_ATOP);
DrawableCompat.setTint(progress, getResources().getColor(COLOR2));
progress = drawable.getDrawable(0);
DrawableCompat.setTint(progress, getResources().getColor(COLOR2));

এটি ভগ্নাংশের ধাপগুলি রঙ রাখবে।


4
<!--For rating bar -->
    <style name="RatingBarfeed" parent="Theme.AppCompat">
        <item name="colorControlNormal">@color/colorPrimary</item>
        <item name="colorControlActivated">@color/colorPrimary</item>
    </style>

আপনার নিজের রঙ ব্যবহার করুন


4

একটি নতুন শৈলী যুক্ত করে আপনি এর মধ্যে রঙিন রঙ ব্যবহার করতে পারেন RatingBar

             <RatingBar
                    android:id="@+id/ratingBar"
                    style="@android:style/Widget.Holo.RatingBar.Small"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:numStars="5"
                    android:rating="4.5"
                    android:stepSize="0.5"
                    android:progressTint="@color/colorPrimary"/>

3

21 এর নীচে এবং উপরের সংস্করণের অ্যান্ড্রয়েডের জন্য কাজ করে

কিছু গবেষণার পরে আমি এই পদ্ধতিটি নিয়ে পটভূমির রঙ, ফাঁক আভা (যেমন: অর্ধ তারকা) এবং তারার রঙের রঙ নির্ধারণ করতে এসেছি।

LayerDrawable layers = (LayerDrawable) ratingBar.getProgressDrawable();
DrawableCompat.setTint(layers.getDrawable(0), 0x33000000); // The background tint
DrawableCompat.setTint(layers.getDrawable(1), 0x00000000); // The gap tint (Transparent in this case so the gap doesnt seem darker than the background)
DrawableCompat.setTint(layers.getDrawable(2), 0xffFED80A); // The star tint

3

সাধারণ সমাধান, এটি অর্জনের জন্য AppCompatRatingBar এবং এটির সেটপ্রোগ্রেসটিন্টলিস্ট পদ্ধতিটি ব্যবহার করুন, রেফারেন্সের জন্য এই উত্তরটি দেখুন ।


এটি আমার জন্য com.google.android.material: উপাদান: 1.1.0-alpha02
মার্ক লাপাসা

2

আমি নিম্নলিখিত এই সমস্যাটি সমাধান:

LayerDrawable layerDrawable = (LayerDrawable) ratingBar.getProgressDrawable();

DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)),
                       Color.WHITE);  // Empty star
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)),
                       Color.YELLOW); // Partial star
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)),
                       Color.YELLOW);

ধন্যবাদ, এটি কাজ করে। ভগ্নাংশের রেটিংয়ের জন্য তারা পুরো আঁকা হয়।
কুলমাইন্ড

2
RatingBar mRating=(RatingBar)findViewById(R.id.rating);
 LayerDrawable layerDrawable=(LayerDrawable)mRating.getProgressDrawable();
 layerDrawable.getDrawable(2).setColorFilter(Color.parseColor
 ("#32CD32"),    PorterDuff.Mode.SRC_ATOP);

আমার জন্য এটি কাজ ....


1

আপনার থিম অনুসারে তারার রঙ পরিবর্তন করার জন্য আমি একটি সহজ সমাধান পেয়েছি।

এই সাইটে যান: http://android-holo-colors.com/

আপনার থিমের রঙ চয়ন করুন এবং আপনার তারা চিত্রগুলি তৈরি করুন।


1

উপরের উত্তরগুলি ব্যবহার করে, আমি একটি দ্রুত স্থির পদ্ধতি তৈরি করেছি যা সহজেই পুনরায় ব্যবহার করা যায়। এটি কেবল সক্রিয় তারকাদের জন্য অগ্রগতির রঙিন রঙিন লক্ষ্য। যে নক্ষত্রগুলি সক্রিয় হয় না তারা ধূসর থাকে।

    public static RatingBar tintRatingBar (RatingBar ratingBar, int progressColor)if (ratingBar.getProgressDrawable() instanceof LayerDrawable) {
        LayerDrawable progressDrawable = (LayerDrawable) ratingBar.getProgressDrawable();
        Drawable drawable = progressDrawable.getDrawable(2);
        Drawable compat = DrawableCompat.wrap(drawable);
        DrawableCompat.setTint(compat, progressColor);
        Drawable[] drawables = new Drawable[3];
        drawables[2] = compat;

        drawables[0] = progressDrawable.getDrawable(0);
        drawables[1] = progressDrawable.getDrawable(1);

        LayerDrawable layerDrawable = new LayerDrawable(drawables);

        ratingBar.setProgressDrawable(layerDrawable);

        return ratingBar;
    }
    else {
        Drawable progressDrawable =  ratingBar.getProgressDrawable();
        Drawable compat = DrawableCompat.wrap(progressDrawable);
        DrawableCompat.setTint(compat, progressColor);
        ratingBar.setProgressDrawable(compat);
        return ratingBar;
    }
}

কেবল আপনার রেটিং বার এবং একটি রঙ ব্যবহার করে পাস করুন getResources().getColor(R.color.my_rating_color)

আপনি দেখতে পাচ্ছেন, আমি ড্রইবল কমপ্যাট ব্যবহার করি যাতে এটি পিছনে সামঞ্জস্যপূর্ণ।

সম্পাদনা: এই পদ্ধতিটি API21 এ কাজ করে না (কেন চিত্র দেখুন)। সেটপ্রোগ্রেসবারে কল করার সময় আপনি একটি নালপয়েন্টার এক্সসেপশন শেষ করেন। আমি API> = 21 এ সম্পূর্ণ পদ্ধতিটি অক্ষম করেছিলাম।

এপিআই> = 21 এর জন্য, আমি সাপারপুসিও সমাধান ব্যবহার করি।


java.lang.ClassCastException: android.support.v4.graphics.drawable.DrawableWrapperHoneycomb প্রাক Lollipop উপর android.graphics.drawable.LayerDrawable কাস্ট করা যাবে না
Ishaan Garg

1
@ ইশানগার্গ আপনি ঠিক বলেছেন আমি একই ইস্যুতে দৌড়েছি এবং আমার পদ্ধতিটি আপডেট করেছি। আমি মামলাটি পরিচালনা করতে আমার কোড আপডেট করেছি। আমি এটি অ্যান্ড্রয়েড সংস্করণের বিষয় বলে মনে করি না। আপনি যদি রেটিং বারের ছোট সংস্করণটি (স্টাইল = "? অ্যান্ড্রয়েড: অ্যাট্রির / রেটিংবার্স স্টাইলস্মল" সহ) ব্যবহার করেন, তবে ফিরে আসা অঙ্কনটি এখনও একটি লেআউটড্রেইবল।
জেডেনাইস

হ্যাঁ, আমি যা প্রয়োগ করেছি ঠিক তেমনই অ্যাপকম্প্যাটরেটিংবার ব্যবহার নিশ্চিত করুন। যদিও আমি এক্সএমএল / জাভা থেকে রেটিংটি প্রাক-সেট করার সময় অর্ধ তারা পেতে সক্ষম নই। সেটরেটিংয়ের মতো (3.5) 4 পূর্ণ তারা দেখায়
ইশান গার্গ

1

টাচ স্টারে রঙ পরিবর্তনের জন্য রেটিং বারটি স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়।

অ্যাপ্লিকেশনটিতে প্রথমে শৈলী যুক্ত করুন \ src \ main \ res \ মান \ styles.xML ফাইল:

<style name="RatingBar" parent="Theme.AppCompat">
    <item name="colorControlNormal">@android:color/darker_gray</item>
    <item name="colorControlActivated">@color/com_facebook_blue</item>
</style>

তারপরে আপনার রেটিং বারটিতে থিম যুক্ত করুন:

<RatingBar
   android:id="@+id/rating"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:numStars="5"
   android:stepSize="1"
   android:theme="@style/RatingBar"/>

0

1) এই এক্সএমএল ঘোষণা

<LinearLayout 
             android:layout_width="match_parent"
        android:layout_height="wrap_content"
         android:layout_alignParentBottom="true"
         android:orientation="horizontal"
         android:paddingLeft="20dp"
         android:paddingRight="20dp"
         android:layout_marginBottom="20dp"
         android:background="#323232"
         android:gravity="center_horizontal">

       <com.example.android.custom_ratingbar.CustomRatingBar
        android:id="@+id/coloredRatingBar5"
        style="@style/coloredRatingBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"

         />
       </LinearLayout>

2) স্টাইল.এক্সএমএল এ

<style name="coloredRatingBarStyleSmall">
        <item name="indicator">false</item>
        <item name="type">small</item>
    </style>

3)

import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class CustomRatingBar extends View{

    private static final String TAG="ColoredRatingBar";
    private static final int NORMAL = 0;
    private static final int SMALL = 1;

    Bitmap[] drawables;
    Bitmap progressBackground;
    Context mContext;
    private int mNumStars =9;
    private float mRating =0;
    private boolean mIndicator;
    private float slidePosition;
    private int mType;

    /**
     * A callback that notifies clients when the rating has been changed. This
     * includes changes that were initiated by the user through a touch gesture
     * or arrow key/trackball as well as changes that were initiated
     * programmatically.
     */
    public interface OnRatingBarChangeListener {

        /**
         * Notification that the rating has changed. Clients can use the
         * fromUser parameter to distinguish user-initiated changes from those
         * that occurred programmatically. This will not be called continuously
         * while the user is dragging, only when the user finalizes a rating by
         * lifting the touch.
         *
         * @param ratingBar The RatingBar whose rating has changed.
         * @param rating The current rating. This will be in the range
         *            0..numStars.
         * @param fromUser True if the rating change was initiated by a user's
         *            touch gesture or arrow key/horizontal trackbell movement.
         */
        void onRatingChanged(CustomRatingBar ratingBar, float rating, boolean fromUser);

    }

    private OnRatingBarChangeListener mOnRatingBarChangeListener;

    public CustomRatingBar(Context context) {
        this(context, null);
    }
    public CustomRatingBar(Context context, AttributeSet attrs) {
        this(context, attrs,0);//R.attr.coloredRatingBarStyle
    }

    public CustomRatingBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomRatingBar,defStyle, 0);
        final boolean indicator = a.getBoolean(R.styleable.CustomRatingBar_indicator, false);
        final float rating = a.getFloat(R.styleable.CustomRatingBar_setrating, -1);
        final int type = a.getInt(R.styleable.CustomRatingBar_type, 0);
        a.recycle();

        setIndicator(indicator);
        setRating(rating);
        setType(type);
        init(context);
    }

    public int getType() {
        return mType;
    }

    public void setType(int type) {
        this.mType = type;
    }

    private void init(Context context) {
        mContext = context;
        Resources res = getResources();
        if(mType==SMALL){
            drawables = new Bitmap[]{BitmapFactory.decodeResource(res, R.drawable.rating_inactive),BitmapFactory.decodeResource(res, R.drawable.rating_active)};
            progressBackground = BitmapFactory.decodeResource(res, R.drawable.rating_inactive);
        }else{
            drawables = new Bitmap[]{BitmapFactory.decodeResource(res, R.drawable.rating_inactive),BitmapFactory.decodeResource(res, R.drawable.rating_active)};
            progressBackground = BitmapFactory.decodeResource(res, R.drawable.rating_inactive);
        }

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //draw empty stars bg
        for(int i=0;i< mNumStars;i++){
            drawStar(canvas,i);
        }

    }


    private void drawStar(Canvas canvas, int position) {
        float fraction = mRating -(position);
        Bitmap ratedStar1 = getRatedStar();
        Paint paint=getPaint(position);
        int division=getSize();
        Bitmap ratedStar=null;
        Bitmap emptyStar=null;
       if(!isInEditMode()){
        ratedStar=Bitmap.createScaledBitmap(ratedStar1, division, division, false);
        emptyStar=Bitmap.createScaledBitmap(progressBackground, division, division, false);
       }
        if((position)< mRating){
            if(!isInEditMode()){
           canvas.drawBitmap(ratedStar,(position* division),0,paint);
            }

        } else{

                if(!isInEditMode()){
              canvas.drawBitmap(emptyStar,(position*division),0,null);

            }
        }


    }
    private int getSize(){
        return (getWidth()/mNumStars);
    }

    private Bitmap getRatedStar() {

        if(mRating==0){
            return drawables[0];
        }
        else{
            return drawables[1];
        }
    }

    private Paint getPaint(int position){
        int value=(255*(position+1))/mNumStars;
        String hexString=Integer.toHexString(value).equals("0")?"00":Integer.toHexString(value);
        String hexvalue="#"+hexString+"000000";//FEE98E
        //Log.e("TAG", position+"/"+value+"/"+hexvalue);

        Paint paint=new Paint();

        paint.setColor(Color.parseColor(hexvalue));

        return paint;
    }

    public int getNumStars() {
        return mNumStars;
    }

    public void setNumStars(int numStars) {
        this.mNumStars = numStars;
    }

    public float getRating() {
        return mRating;
    }

    public void setRating(float rating) {
        setRating(rating,false);
    }

    void setRating(float rating,boolean fromUser) {
        if(rating>mNumStars){
            this.mRating = mNumStars;
        }
        this.mRating = rating;
        invalidate();
        dispatchRatingChange(fromUser);
    }

    public boolean isIndicator() {
        return mIndicator;
    }

    public void setIndicator(boolean indicator) {
        this.mIndicator = indicator;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (progressBackground != null) {

            final int width = progressBackground.getWidth() * mNumStars;
            final int height = progressBackground.getHeight();

            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            Bitmap emptyStar=Bitmap.createScaledBitmap(progressBackground, widthSize/mNumStars, widthSize/mNumStars, false);
            int heightSize = emptyStar.getHeight();

            setMeasuredDimension(resolveSizeAndState(widthSize, widthMeasureSpec, 0),
                    resolveSizeAndState(heightSize, heightMeasureSpec, 0));
        }
        else{
              int desiredWidth = 100;
            int desiredHeight = 50;

            int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);

            int width;
            int height;

            //Measure Width
            if (widthMode == MeasureSpec.EXACTLY) {
                //Must be this size
                width = widthSize;
            } else if (widthMode == MeasureSpec.AT_MOST) {
                //Can't be bigger than...
                width = Math.min(desiredWidth, widthSize);
            } else {
                //Be whatever you want
                width = desiredWidth;
            }

            //Measure Height
            if (heightMode == MeasureSpec.EXACTLY) {
                //Must be this size
                height = heightSize;
            } else if (heightMode == MeasureSpec.AT_MOST) {
                //Can't be bigger than...
                height = Math.min(desiredHeight, heightSize);
            } else {
                //Be whatever you want
                height = desiredHeight;
            }

            //MUST CALL THIS
          setMeasuredDimension(resolveSizeAndState(width, widthMeasureSpec, 0),resolveSizeAndState(height, heightMeasureSpec, 0));
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(mIndicator){
            return false;
        }

        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                slidePosition = getRelativePosition(event.getX());

                int newRating = (int)(slidePosition>0?slidePosition+1:0) ;
                if(newRating>mNumStars){
                    newRating=mNumStars;
                }

             //   Log.e("TAG", ""+newRating);
                if (newRating != mRating) {
                    setRating(newRating,true);
                }
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            default:
                break;
        }

        return true;
    }

    private float getRelativePosition(float x) {
        Bitmap emptyStar=Bitmap.createScaledBitmap(progressBackground, getWidth()/mNumStars, getWidth()/mNumStars, false);
        int widthSize = emptyStar.getWidth();
      //  Log.e("TAG", widthSize+"/"+x);
         float position = x / widthSize;
       position = Math.max(position, 0);
       return Math.min(position, mNumStars);
    }

    /**
     * Sets the listener to be called when the rating changes.
     *
     * @param listener The listener.
     */
    public void setOnRatingBarChangeListener(OnRatingBarChangeListener listener) {
        mOnRatingBarChangeListener = listener;
    }

    /**
     * @return The listener (may be null) that is listening for rating change
     *         events.
     */
    public OnRatingBarChangeListener getOnRatingBarChangeListener() {
        return mOnRatingBarChangeListener;
    }

    void dispatchRatingChange(boolean fromUser) {
        if (mOnRatingBarChangeListener != null) {
            mOnRatingBarChangeListener.onRatingChanged(this, getRating(),
                    fromUser);
        }
    }
}


5) then in calling activity---

CustomRatingBar coloredRatingBar5=(CustomRatingBar)findViewById(R.id.coloredRatingBar5);
        coloredRatingBar5.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {

            @Override
            public void onRatingChanged(CustomRatingBar ratingBar, float rating,boolean fromUser) {
                // TODO Auto-generated method stub
                Log.e("RATING", ""+rating);

            }
        });

)) রেটিং সক্রিয় --- ডার্ক কালার কোজের সাথে যে কোনও চিত্র নিন এটি বিভিন্ন রেটিংয়ের জন্য রঙ স্বচ্ছতা হিসাবে ব্যবহৃত হবে

রেটিং_ইনাকটিভ - হালকা ব্যাকগ্রাউন্ড সহ উপরের চিত্রের একই আকারের যে কোনও চিত্র নিয়ে যান .. যখন কোনও রেটিং নির্বাচিত না হয় এটি ব্যবহৃত হবে


0

তারার সীমানা রঙ পরিবর্তন করার খুব সহজ উপায়টি এক্সএমএল প্যারামিটারটি ব্যবহার করছে:

android:progressBackgroundTint=""

রেটিংবার ভিউতে। মানটি কোনও রঙের জন্য একটি হেক্সাডেসিমাল কোড হওয়া উচিত।


কেন জানি না, তবে মনে হয় আপনার পদ্ধতিটি কেবল তারার সীমানাকেই প্রভাবিত করে (ভরাট রঙটি পূর্বনির্ধারিত বর্ণ হিসাবে থেকে যায়)
সুপারপুসিও

ঠিক আছে, আপনি কিছু এক্সএমএল প্যারাম মিস করেছেন। আমার উত্তরটি এখানে নীচে দেখুন।
সুপারপুসিও

1
তুমি ঠিক বলছো. আমি জানি না কেন আমি ভাবছিলাম তারার সীমানা রঙ পরিবর্তন করতে সমস্যা হয়েছে (সম্ভবত কারণ যদি আমার সমস্যা ছিল)। আপনার উত্তর আরও সম্পূর্ণ।
পাউ আরল্যান্ডিস মার্টিনেজ

0

আমি এপিআই 9-তে সর্বনিম্নভাবে এটি করার জন্য একটি নির্ভরযোগ্য পদ্ধতির সন্ধান করছিলাম। "কাস্টিং টু লেয়ারড্রেবল" সমাধানটি আমার কাছে ঝুঁকিপূর্ণ সমাধানের মতো মনে হয়েছিল এবং আমি যখন ২.৩-তে একটি অ্যান্ড্রয়েড ফোনে এটি পরীক্ষা করেছিলাম তখন এটি সফলভাবে কাস্ট হয়েছিল তবে ড্রয়যোগ্যকম্প্যাট.সেটিন্ট (...) এ কল করার কোনও ফল হয়নি।

অঙ্কনযোগ্য সম্পদ লোড করার প্রয়োজনীয়তা আমার পক্ষে ভাল সমাধানের মতো মনে হয়নি।

আমি নিজের সমাধানটি কোড করার সিদ্ধান্ত নিয়েছি যা একটি ক্লাস যা AppCompatRatingBar প্রসারিত, একটি নিজস্ব কাস্টম ড্রয়নেবল ব্যবহার করে তারকাদের প্রোগ্রামিয়ালি আঁকার যত্ন নিচ্ছে। এটি আমার প্রয়োজনের জন্য নিখুঁতভাবে কাজ করে, আমি যদি এটি কাউকে সহায়তা করে তবে এটি পোস্ট করব:

https://gist.github.com/androidseb/2b8044c90a07c7a52b4bbff3453c8460

লিঙ্কটি আরও সহজ কারণ আপনি সরাসরি সম্পূর্ণ ফাইলটি পেতে পারেন তবে ঠিক এখানে ক্ষেত্রে পুরো কোডটি এখানে রয়েছে:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.AppCompatRatingBar;
import android.util.AttributeSet;

/**
 * @author androidseb
 *         <p/>
 *         Extends AppCompatRatingBar with the ability to tint the drawn stars when selected, pressed and un-selected.
 *         Limitation: Only draws full stars.
 */
public class TintableRatingBar extends AppCompatRatingBar {
    private TintableRatingBarProgressDrawable progressDrawable;

    public TintableRatingBar(final Context context) {
        super(context);
        init();
    }

    public TintableRatingBar(final Context context, final AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TintableRatingBar(final Context context, final AttributeSet attrs, final int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        progressDrawable = new TintableRatingBarProgressDrawable();
        setProgressDrawable(progressDrawable);
    }

    public void setCustomTintColors(final int _uncheckedColor, final int _pressedColor, final int _checkedColor) {
        progressDrawable.setRatingMaxLevelValue(getMax() * 1000);
        progressDrawable.setUnCheckedColor(_uncheckedColor);
        progressDrawable.setPressedColor(_pressedColor);
        progressDrawable.setCheckedColor(_checkedColor);
        invalidate();
    }

    public class TintableRatingBarProgressDrawable extends Drawable {
        private static final int STAR_COUNT = 5;
        private static final int STAR_BRANCHES_COUNT = 5;

        /** Sets the max level value: if the level is at the max, then all stars are selected. */
        private int ratingMaxLevelValue = 10000;
        /** Color to be painted for unselected stars */
        private int uncheckedColor = Color.GRAY;
        /** Color to be painted for unselected stars when the ratingbar is pressed */
        private int pressedColor = Color.CYAN;
        /** Color to be painted for selected stars */
        private int checkedColor = Color.BLUE;

        @Override
        public void setAlpha(final int _i) {
        }

        @Override
        public void setColorFilter(final ColorFilter _colorFilter) {
        }

        @Override
        public boolean isStateful() {
            return true;
        }

        @Override
        public boolean setState(final int[] stateSet) {
            final boolean res = super.setState(stateSet);
            invalidateSelf();
            return res;
        }

        @Override
        public int getOpacity() {
            return 255;
        }

        public void setRatingMaxLevelValue(final int _ratingMaxLevelValue) {
            ratingMaxLevelValue = _ratingMaxLevelValue;
        }

        public void setUnCheckedColor(final int _uncheckedColor) {
            uncheckedColor = _uncheckedColor;
        }

        public void setPressedColor(final int _pressedColor) {
            pressedColor = _pressedColor;
        }

        public void setCheckedColor(final int _checkedColor) {
            checkedColor = _checkedColor;
        }

        @Override
        public void draw(final Canvas _canvas) {
            boolean pressed = false;
            for (int i : getState()) {
                if (i == android.R.attr.state_pressed) {
                    pressed = true;
                }
            }

            final int level = (int) Math.ceil(getLevel() / (double) ratingMaxLevelValue * STAR_COUNT);
            final int starRadius = Math.min(getBounds().bottom / 2, getBounds().right / STAR_COUNT / 2);

            for (int i = 0; i < STAR_COUNT; i++) {
                final int usedColor;
                if (level >= i + 1) {
                    usedColor = checkedColor;
                } else if (pressed) {
                    usedColor = pressedColor;
                } else {
                    usedColor = uncheckedColor;
                }
                drawStar(_canvas, usedColor, (i * 2 + 1) * starRadius, getBounds().bottom / 2, starRadius,
                    STAR_BRANCHES_COUNT);
            }
        }

        private void drawStar(final Canvas _canvas, final int _color, final float _centerX, final float _centerY,
            final float _radius, final int _branchesCount) {
            final double rotationAngle = Math.PI * 2 / _branchesCount;
            final double rotationAngleComplement = Math.PI / 2 - rotationAngle;
            //Calculating how much space is left between the bottom of the star and the bottom of the circle
            //In order to be able to center the star visually relatively to the square when drawn
            final float bottomOffset = (float) (_radius - _radius * Math.sin(rotationAngle / 2) / Math.tan(
                rotationAngle / 2));
            final float actualCenterY = _centerY + (bottomOffset / 2);
            final Paint paint = new Paint();
            paint.setColor(_color);
            paint.setStyle(Style.FILL);
            final Path path = new Path();
            final float relativeY = (float) (_radius - _radius * (1 - Math.sin(rotationAngleComplement)));
            final float relativeX = (float) (Math.tan(rotationAngle / 2) * relativeY);
            final PointF a = new PointF(-relativeX, -relativeY);
            final PointF b = new PointF(0, -_radius);
            final PointF c = new PointF(relativeX, -relativeY);
            path.moveTo(_centerX + a.x, actualCenterY + a.y);
            _canvas.save();
            for (int i = 0; i < _branchesCount; i++) {
                path.lineTo(_centerX + b.x, actualCenterY + b.y);
                path.lineTo(_centerX + c.x, actualCenterY + c.y);
                rotationToCenter(b, rotationAngle);
                rotationToCenter(c, rotationAngle);
            }
            _canvas.drawPath(path, paint);
            _canvas.restore();
        }

        private void rotationToCenter(final PointF _point, final double _angleRadian) {
            final float x = (float) (_point.x * Math.cos(_angleRadian) - _point.y * Math.sin(_angleRadian));
            final float y = (float) (_point.x * Math.sin(_angleRadian) + _point.y * Math.cos(_angleRadian));
            _point.x = x;
            _point.y = y;
        }
    }
}

0

কিছুটা দেরি করা উত্তর তবে আমি আশা করি এটি কিছু লোককে সহায়তা করবে।

<RatingBar
         android:id="@+id/rating"
         style="@style/Base.Widget.AppCompat.RatingBar.Small"
         android:theme="@style/WhiteRatingStar"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_below="@+id/profil_name"
         android:layout_centerHorizontal="true"
         android:layout_marginLeft="@dimen/dimen_4"
         android:rating="3" />

এবং এখানে হোয়াইটরেটিংস্টারের মতো দেখতে

<style name="WhiteRatingStar" parent="Base.Widget.AppCompat.RatingBar.Small">
     <item name="colorAccent">@android:color/white</item>
</style>

এটির সাথে উদাহরণস্বরূপ তারাগুলি সাদা রঙে রঞ্জিত হবে।



-1

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.