Saya pikir Anda harus membuat bilah peringkat kustom sendiri jika Anda ingin melakukannya
Donal Rafferty
Saya menulis posting blog yang menjelaskan cara mengubah gambar RatingBar: kozyr.zydako.net/2010/05/23/pretty-ratingbar Ini juga menunjukkan di mana Anda dapat menentukan ukuran gambar ...
kozyr
Saya berharap pertanyaan ini untuk bilah peringkat warna-warni seperti yang ditunjukkan di situs web, tidak dapat menemukannya sendiri. Membuat implementasi sederhana sendiri github.com/codebreaker/coloredratingbar-android . Semoga ini bisa membantu seseorang di luar sana.
jaga
Jawaban:
26
Langkah # 1: Buat gaya Anda sendiri, dengan mengkloning salah satu gaya yang ada (dari $ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml), meletakkannya di proyek Anda sendiristyles.xml , dan merujuknya ketika Anda menambahkan widget ke tata letak.
Langkah # 2: Buat LayerDrawablesumber XML Anda sendiri untuk RatingBar, menunjuk ke gambar yang sesuai untuk digunakan untuk bar. Gaya asli akan mengarahkan Anda ke sumber daya yang ada yang dapat Anda bandingkan. Kemudian, sesuaikan gaya Anda untuk menggunakan LayerDrawablesumber daya Anda sendiri , daripada yang bawaan.
Per langkah # 2, Ini tidak berfungsi untuk perangkat Samsung 3 atau yang lainnya, ini tidak harus merupakan LayerDrawable. Lihat di sini untuk info: stackoverflow.com/questions/30266334/…
Agak rumit di blog yang disebutkan, saya sudah menggunakan cara yang serupa tapi lebih sederhana. Anda perlu 3 gambar bintang (red_star_full.png, red_star_half.png dan red_star_empty.png) dan satu xml, itu saja.
Halo Alex, saya sudah mencoba solusi ini tetapi ketika saya mencoba untuk mengatur peringkat ke sesuatu seperti 1.1, 1.2, dll ... itu ditampilkan sebagai 1,5. Saya telah mengambil 3 gambar bintang, satu kosong, satu setengah penuh dan satu lagi penuh. Saya kira itu seharusnya interpolasi di antara mereka untuk mendapatkan komponen fraksional, saya hanya ingin tahu apakah ada orang lain yang memiliki masalah yang sama atau apakah saya melakukan sesuatu yang salah?
Graham Baitson
Bisakah Anda menghubungi saya tentang gambar yang harus kami gunakan jika cuaca berwarna dan ukuran gambar tidak dapat menyelesaikan ini ...
Prithviraj Shiroor
1
Semua orang melihat jawaban pembaruan 2015 di bawah ini! Jauh lebih mudah dan sederhana!
katie
Jawaban ini masih memberikan lebih banyak fleksibilitas atas berbagai status bintang.
Tom Brinkkemper
Mengapa saya mendapatkan garis vertikal di bawah bintang? Saya mencoba mendefinisikan gaya khusus, menentukan ketinggian, tetapi masih ada garis-garis vertikal di bawah bintang pada AVD saya.
Apa sebenarnya PorterDuff.Mode.SRC_ATOPartinya atau apa yang dilakukan?
Zapnologica
5
Tidak bekerja di API 5.0 dan lebih tinggi. Kebutuhan:Drawable stars = rb.getProgressDrawable(); stars.setTint( Color.YELLOW );
zyamys
@zyamys Ini benar-benar menyebalkan = (Diperlukan metode untuk "versi yang lebih tinggi" dan metode lain untuk versi yang lebih lama?
Daniela Morais
1
Ini hanya bekerja untuk ketelitian 0,5. Jika tidak (presisi <0,5) hamparan menjadi aneh dan sepertinya warna biru masih dengan ketelitian 0,5 sedangkan kuning tepat
Teo Inke
1
Peringatan: Gangguan pada perangkat pra-lolipop. Pergilah dengan jawaban yang diterima.
blockwala
70
Cara termudah yang bekerja untuk saya ... jika Anda memperluas Aktivitas AppCompat
Di build.gradle Anda tambahkan pustaka appcompat terbaru.
dependencies {
compile 'com.android.support:appcompat-v7:X.X.X'// where X.X.X version}
Buat aktivitas Anda memperpanjang android.support.v7.app.AppCompatActivity
Terima kasih @Vishal Kumar. Saya mencobanya di Kitkat 4.4.4 (Samsung S3 neo) dan Marshmallow 6.0.1 (Samsung Galaxy On Nxt), itu berhasil. Namun tidak berhasil di Lollipop 5.1 (Micromax). Untuk Lollipop saya menggunakan atribut "android: progressTint" di RatingBar dan ya itu berfungsi.
Prashant
Itu solusi terbaik.
Arhat Baid
Ini harus menjadi jawaban yang benar yang dipilih.
Hampel Előd
1
Ini solusi terbaik. Jika Anda ingin mengubah ukuran bintang, Anda bisa menggunakannya style="?android:ratingBarStyleSmall"bersama.
Apakah ada cara untuk mengatur warna bintang berdasarkan data yang diambil dari database? Katakanlah saya mendapat 5 bintang dan data yang dikembalikan dari basis data adalah 4. Jadi alih-alih mengubah semua 5, saya hanya mengubah 4 yang pertama
1
getColor sudah tidak digunakan lagi sekarang, ada alternatif lain?
Manohar Reddy
2
Anda dapat menemukan jawaban di sini stackoverflow.com/a/32202256/2513291 Misalnya, pendekatan ini ContextCompat.getColor (konteks, R.color.color_name)
Yuriy Vinogradov
berfungsi dengan baik, tetapi perhatikan bahwa, untuk beberapa alasan, urutannya penting (2, lalu 1, lalu 0). Saya mencoba sebaliknya dan itu menyebabkan beberapa gangguan UI saat pertama kali warna berubah.
Simon Ninon
25
Solusi yang diposkan Alex dan CommonsWares sudah benar. Satu hal yang tidak pernah dibicarakan oleh Android adalah ukuran piksel yang tepat untuk kepadatan yang berbeda. Berikut adalah dimensi yang diperlukan untuk setiap kerapatan berdasarkan cahaya halo.
dapatkah saya menggunakan vectordrawble dengan bintang
Mina Fawzy
24
Jadi saya telah berjuang dengan masalah ini selama dua jam dan saya telah datang dengan solusi yang berfungsi untuk semua versi API, di mana peringkat setengah bintang juga ditampilkan.
satu-satunya cara yang bekerja untuk saya di API19, tapi saya belum menyerah untuk mencari cara melakukan ini dari xml hanya T_T
Beeing Jk
@BeeingJk jika Anda membuat tampilan kustom yang memperluas RatingBar, Anda dapat membuat atribut xml Anda sendiri untuk menentukan warna warna. Anda kemudian memiliki satu titik kontrol untuk mengatur warna dan dapat menentukan warna dalam xml. Semoga itu bisa membantu! Dapat menjelaskan lebih banyak jika diperlukan
Forrest Bice
Mode.SRC_INatau Mode.MULTIPLY?
Dr.jacky
12
Sekarang Anda dapat menggunakan DrawableCompat dari appcompat v22.1.0 dan seterusnya untuk secara dinamis mewarnai semua jenis digambar, berguna ketika Anda mendukung beberapa tema dengan satu set digambar. Sebagai contoh:
LayerDrawable layerDrawable =(LayerDrawable) ratingBar.getProgressDrawable();DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)),Color.RED);// Empty starDrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)),Color.GREEN);// Partial starDrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)),Color.BLUE);// Full star
Untuk ukuran dan bentuk yang sebenarnya, Anda perlu menentukan gaya baru dan daftar gambar yang dapat digambar untuk ukuran yang sesuai, seperti yang sudah dijawab orang lain di atas.
Drawable bukan array, bagaimana Anda mengakses kemajuan [0]?
blueice
@blueice Maaf, Drawable harus menjadi LayerDrawable, diperbaiki sekarang, terima kasih.
Dan Dar3
Masih sepertinya tidak bekerja untuk saya, saya berakhir dengan apa yang Yuriy Vinogradov berikan dalam tanggapan berbeda terhadap pertanyaan ini dan itu sepertinya berhasil.
blueice
Bagaimana cara mengubah Drawable, bukan Change color?
Bekerja untuk Android di bawah dan di atas versi 21
Setelah beberapa penelitian saya datang dengan metode ini untuk mengatur warna latar belakang, warna celah (misalnya: setengah bintang) dan warna warna bintang.
LayerDrawable layers =(LayerDrawable) ratingBar.getProgressDrawable();DrawableCompat.setTint(layers.getDrawable(0),0x33000000);// The background tintDrawableCompat.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
Dengan menggunakan jawaban di atas, saya membuat metode statis cepat yang dapat dengan mudah digunakan kembali. Ini hanya bertujuan untuk mewarnai warna progres untuk bintang yang diaktifkan. Bintang-bintang yang tidak diaktifkan tetap berwarna abu-abu.
Cukup lewati bilah penilaian dan Warna Anda menggunakan getResources().getColor(R.color.my_rating_color)
Seperti yang Anda lihat, saya menggunakan DrawableCompat sehingga kompatibel dengan backward.
EDIT: Metode ini tidak berfungsi pada API21 (lihat gambar mengapa). Anda berakhir dengan NullPointerException saat memanggil setProgressBar. Saya akhirnya menonaktifkan seluruh metode pada API> = 21.
Untuk API> = 21, saya menggunakan solusi SupperPuccio.
java.lang.ClassCastException: android.support.v4.graphics.drawable.DrawableWrapperHoneycomb tidak dapat dilemparkan ke android.graphics.drawable.LayerDrawable di pre-lollipop
Ishaan Garg
1
@IshaanGarg Anda benar. Saya mengalami masalah yang sama dan memperbarui metode saya. Saya memperbarui kode saya untuk menangani kasus ini. Saya tidak berpikir ini masalah versi Android. Jika Anda menggunakan versi bar rating yang lebih kecil (dengan style = "? Android: attr / ratingBarStyleSmall"), maka drawable yang dikembalikan masih berupa LayoutDrawable.
JDenais
Yup, hanya apa yang telah saya terapkan, pastikan untuk menggunakan AppCompatRatingBar. Meskipun saya tidak bisa mendapatkan setengah bintang saat mengatur peringkat dari XML / java. Seperti setRating (3.5) menunjukkan 4 bintang penuh
Ishaan Garg
1
Rating bar digunakan secara otomatis pada waktu berjalan untuk mengubah warna pada bintang sentuh.
Pertama tambahkan gaya dalam file app \ src \ main \ res \ values \ styles.xml:
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;publicclassCustomRatingBarextendsView{privatestaticfinalString TAG="ColoredRatingBar";privatestaticfinalint NORMAL =0;privatestaticfinalint SMALL =1;Bitmap[] drawables;Bitmap progressBackground;Context mContext;privateint mNumStars =9;privatefloat mRating =0;privateboolean mIndicator;privatefloat slidePosition;privateint 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.
*/publicinterfaceOnRatingBarChangeListener{/**
* 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);}privateOnRatingBarChangeListener mOnRatingBarChangeListener;publicCustomRatingBar(Context context){this(context,null);}publicCustomRatingBar(Context context,AttributeSet attrs){this(context, attrs,0);//R.attr.coloredRatingBarStyle}publicCustomRatingBar(Context context,AttributeSet attrs,int defStyle){super(context, attrs, defStyle);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomRatingBar,defStyle,0);finalboolean indicator = a.getBoolean(R.styleable.CustomRatingBar_indicator,false);finalfloat rating = a.getFloat(R.styleable.CustomRatingBar_setrating,-1);finalint type = a.getInt(R.styleable.CustomRatingBar_type,0);
a.recycle();
setIndicator(indicator);
setRating(rating);
setType(type);
init(context);}publicint getType(){return mType;}publicvoid setType(int type){this.mType = type;}privatevoid init(Context context){
mContext = context;Resources res = getResources();if(mType==SMALL){
drawables =newBitmap[]{BitmapFactory.decodeResource(res, R.drawable.rating_inactive),BitmapFactory.decodeResource(res, R.drawable.rating_active)};
progressBackground =BitmapFactory.decodeResource(res, R.drawable.rating_inactive);}else{
drawables =newBitmap[]{BitmapFactory.decodeResource(res, R.drawable.rating_inactive),BitmapFactory.decodeResource(res, R.drawable.rating_active)};
progressBackground =BitmapFactory.decodeResource(res, R.drawable.rating_inactive);}}@Overrideprotectedvoid onDraw(Canvas canvas){super.onDraw(canvas);//draw empty stars bgfor(int i=0;i< mNumStars;i++){
drawStar(canvas,i);}}privatevoid 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);}}}privateint getSize(){return(getWidth()/mNumStars);}privateBitmap getRatedStar(){if(mRating==0){return drawables[0];}else{return drawables[1];}}privatePaint getPaint(int position){intvalue=(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=newPaint();
paint.setColor(Color.parseColor(hexvalue));return paint;}publicint getNumStars(){return mNumStars;}publicvoid setNumStars(int numStars){this.mNumStars = numStars;}publicfloat getRating(){return mRating;}publicvoid setRating(float rating){
setRating(rating,false);}void setRating(float rating,boolean fromUser){if(rating>mNumStars){this.mRating = mNumStars;}this.mRating = rating;
invalidate();
dispatchRatingChange(fromUser);}publicboolean isIndicator(){return mIndicator;}publicvoid setIndicator(boolean indicator){this.mIndicator = indicator;}@Overrideprotectedvoid onMeasure(int widthMeasureSpec,int heightMeasureSpec){super.onMeasure(widthMeasureSpec, heightMeasureSpec);if(progressBackground !=null){finalint width = progressBackground.getWidth()* mNumStars;finalint 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 Widthif(widthMode ==MeasureSpec.EXACTLY){//Must be this size
width = widthSize;}elseif(widthMode ==MeasureSpec.AT_MOST){//Can't be bigger than...
width =Math.min(desiredWidth, widthSize);}else{//Be whatever you want
width = desiredWidth;}//Measure Heightif(heightMode ==MeasureSpec.EXACTLY){//Must be this size
height = heightSize;}elseif(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));}}@Overridepublicboolean onTouchEvent(MotionEventevent){if(mIndicator){returnfalse;}int action =event.getAction();switch(action){caseMotionEvent.ACTION_DOWN:break;caseMotionEvent.ACTION_MOVE:caseMotionEvent.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;caseMotionEvent.ACTION_CANCEL:break;default:break;}returntrue;}privatefloat 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);returnMath.min(position, mNumStars);}/**
* Sets the listener to be called when the rating changes.
*
* @param listener The listener.
*/publicvoid setOnRatingBarChangeListener(OnRatingBarChangeListener listener){
mOnRatingBarChangeListener = listener;}/**
* @return The listener (may be null) that is listening for rating change
* events.
*/publicOnRatingBarChangeListener getOnRatingBarChangeListener(){return mOnRatingBarChangeListener;}void dispatchRatingChange(boolean fromUser){if(mOnRatingBarChangeListener !=null){
mOnRatingBarChangeListener.onRatingChanged(this, getRating(),
fromUser);}}}5)thenin calling activity---CustomRatingBar coloredRatingBar5=(CustomRatingBar)findViewById(R.id.coloredRatingBar5);
coloredRatingBar5.setOnRatingBarChangeListener(newOnRatingBarChangeListener(){@Overridepublicvoid onRatingChanged(CustomRatingBar ratingBar,float rating,boolean fromUser){// TODO Auto-generated method stubLog.e("RATING",""+rating);}});
6) peringkat aktif --- ambil gambar dengan warna gelap karena akan digunakan sebagai transparansi warna untuk peringkat yang berbeda
rating_inactive - mengambil gambar dengan ukuran yang sama dari gambar di atas dengan latar belakang yang terang..itu akan digunakan ketika tidak ada peringkat yang dipilih
Saya tidak tahu mengapa, tetapi tampaknya metode Anda hanya memengaruhi batas bintang (warna isian tetap menjadi warna default)
superpuccio
Oke, Anda melewatkan beberapa xml params. Lihat jawaban saya di sini di bawah ini.
superpuccio
1
Kamu benar. Saya tidak tahu mengapa saya berpikir dia memiliki masalah dalam mengubah warna perbatasan bintang (mungkin karena jika saya punya masalah). Jawaban Anda lebih lengkap.
Pau Arlandis Martinez
0
Saya sedang mencari metode yang dapat diandalkan untuk melakukan ini hingga API 9 setidaknya. Solusi "casting to LayerDrawble" tampak seperti solusi berisiko bagi saya, dan ketika saya mengujinya pada ponsel Android pada 2.3, itu berhasil, tetapi panggilan ke DrawableCompat.setTint (...) tidak memiliki efek apa pun.
Kebutuhan untuk memuat aset yang dapat ditarik tampaknya juga bukan solusi yang baik bagi saya.
Saya memutuskan untuk membuat kode solusi saya sendiri yang merupakan kelas yang memperluas AppCompatRatingBar, menggunakan Drawable yang disesuaikan untuk menggambar bintang-bintang secara terprogram. Ini berfungsi dengan baik untuk kebutuhan saya, saya akan mempostingnya jika itu membantu siapa pun:
Tautan lebih mudah karena Anda bisa mendapatkan file lengkap secara langsung, tetapi di sini adalah kode lengkap untuk berjaga-jaga:
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.
*/publicclassTintableRatingBarextendsAppCompatRatingBar{privateTintableRatingBarProgressDrawable progressDrawable;publicTintableRatingBar(finalContext context){super(context);
init();}publicTintableRatingBar(finalContext context,finalAttributeSet attrs){super(context, attrs);
init();}publicTintableRatingBar(finalContext context,finalAttributeSet attrs,finalint defStyleAttr){super(context, attrs, defStyleAttr);
init();}privatevoid init(){
progressDrawable =newTintableRatingBarProgressDrawable();
setProgressDrawable(progressDrawable);}publicvoid setCustomTintColors(finalint _uncheckedColor,finalint _pressedColor,finalint _checkedColor){
progressDrawable.setRatingMaxLevelValue(getMax()*1000);
progressDrawable.setUnCheckedColor(_uncheckedColor);
progressDrawable.setPressedColor(_pressedColor);
progressDrawable.setCheckedColor(_checkedColor);
invalidate();}publicclassTintableRatingBarProgressDrawableextendsDrawable{privatestaticfinalint STAR_COUNT =5;privatestaticfinalint STAR_BRANCHES_COUNT =5;/** Sets the max level value: if the level is at the max, then all stars are selected. */privateint ratingMaxLevelValue =10000;/** Color to be painted for unselected stars */privateint uncheckedColor =Color.GRAY;/** Color to be painted for unselected stars when the ratingbar is pressed */privateint pressedColor =Color.CYAN;/** Color to be painted for selected stars */privateint checkedColor =Color.BLUE;@Overridepublicvoid setAlpha(finalint _i){}@Overridepublicvoid setColorFilter(finalColorFilter _colorFilter){}@Overridepublicboolean isStateful(){returntrue;}@Overridepublicboolean setState(finalint[] stateSet){finalboolean res =super.setState(stateSet);
invalidateSelf();return res;}@Overridepublicint getOpacity(){return255;}publicvoid setRatingMaxLevelValue(finalint _ratingMaxLevelValue){
ratingMaxLevelValue = _ratingMaxLevelValue;}publicvoid setUnCheckedColor(finalint _uncheckedColor){
uncheckedColor = _uncheckedColor;}publicvoid setPressedColor(finalint _pressedColor){
pressedColor = _pressedColor;}publicvoid setCheckedColor(finalint _checkedColor){
checkedColor = _checkedColor;}@Overridepublicvoid draw(finalCanvas _canvas){boolean pressed =false;for(int i : getState()){if(i == android.R.attr.state_pressed){
pressed =true;}}finalint level =(int)Math.ceil(getLevel()/(double) ratingMaxLevelValue * STAR_COUNT);finalint starRadius =Math.min(getBounds().bottom /2, getBounds().right / STAR_COUNT /2);for(int i =0; i < STAR_COUNT; i++){finalint usedColor;if(level >= i +1){
usedColor = checkedColor;}elseif(pressed){
usedColor = pressedColor;}else{
usedColor = uncheckedColor;}
drawStar(_canvas, usedColor,(i *2+1)* starRadius, getBounds().bottom /2, starRadius,
STAR_BRANCHES_COUNT);}}privatevoid drawStar(finalCanvas _canvas,finalint _color,finalfloat _centerX,finalfloat _centerY,finalfloat _radius,finalint _branchesCount){finaldouble rotationAngle =Math.PI *2/ _branchesCount;finaldouble 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 drawnfinalfloat bottomOffset =(float)(_radius - _radius *Math.sin(rotationAngle /2)/Math.tan(
rotationAngle /2));finalfloat actualCenterY = _centerY +(bottomOffset /2);finalPaint paint =newPaint();
paint.setColor(_color);
paint.setStyle(Style.FILL);finalPath path =newPath();finalfloat relativeY =(float)(_radius - _radius *(1-Math.sin(rotationAngleComplement)));finalfloat relativeX =(float)(Math.tan(rotationAngle /2)* relativeY);finalPointF a =newPointF(-relativeX,-relativeY);finalPointF b =newPointF(0,-_radius);finalPointF c =newPointF(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();}privatevoid rotationToCenter(finalPointF _point,finaldouble _angleRadian){finalfloat x =(float)(_point.x *Math.cos(_angleRadian)- _point.y *Math.sin(_angleRadian));finalfloat y =(float)(_point.x *Math.sin(_angleRadian)+ _point.y *Math.cos(_angleRadian));
_point.x = x;
_point.y = y;}}}
Seperti yang disiratkan oleh jawaban sebelumnya, tidak mudah untuk mengubah warna dari bar penilaian. Bintang-bintang tidak ditarik secara pemrograman, mereka adalah gambar dengan ukuran tetap dan gradien warna tertentu. Untuk mengubah warna Anda harus membuat gambar bintang Anda sendiri dengan warna yang berbeda kemudian lanjutkan untuk membuat sumber daya XML Anda sendiri yang dapat ditarik dan meneruskannya ke peringkat kelasBar menggunakan setProgressDrawable (Drawable d) atau XML atribut android: progressDrawable.
Jawaban:
Langkah # 1: Buat gaya Anda sendiri, dengan mengkloning salah satu gaya yang ada (dari
$ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml
), meletakkannya di proyek Anda sendiristyles.xml
, dan merujuknya ketika Anda menambahkan widget ke tata letak.Langkah # 2: Buat
LayerDrawable
sumber XML Anda sendiri untukRatingBar
, menunjuk ke gambar yang sesuai untuk digunakan untuk bar. Gaya asli akan mengarahkan Anda ke sumber daya yang ada yang dapat Anda bandingkan. Kemudian, sesuaikan gaya Anda untuk menggunakanLayerDrawable
sumber daya Anda sendiri , daripada yang bawaan.sumber
Agak rumit di blog yang disebutkan, saya sudah menggunakan cara yang serupa tapi lebih sederhana. Anda perlu 3 gambar bintang (red_star_full.png, red_star_half.png dan red_star_empty.png) dan satu xml, itu saja.
Letakkan 3 gambar ini di res / drawable.
Letakkan di sana ratingbar_red.xml berikut:
dan, akhirnya, beri tahu definisi ratingbar Anda untuk menggunakan ini, yaitu
Itu dia.
sumber
Coba ini, jika Anda hanya ingin mengubah warna:
sumber
PorterDuff.Mode.SRC_ATOP
artinya atau apa yang dilakukan?Drawable stars = rb.getProgressDrawable(); stars.setTint( Color.YELLOW );
Cara termudah yang bekerja untuk saya ... jika Anda memperluas Aktivitas AppCompat
Di build.gradle Anda tambahkan pustaka appcompat terbaru.
Buat aktivitas Anda memperpanjang android.support.v7.app.AppCompatActivity
Nyatakan gaya khusus di file styles.xml Anda.
Terapkan gaya ini ke RatingBar Anda melalui atribut android: theme.
sumber
style="?android:ratingBarStyleSmall"
bersama.<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>
dan rating AndaBarandroid:theme="@style/RatingBarSmallTheme"
Pembaruan 2015
Sekarang Anda dapat menggunakan DrawableCompat untuk mewarnai semua jenis drawable. Sebagai contoh:
Ini kompatibel ke belakang hingga API 4
sumber
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {}
karena ini bekerja secara default dari API 22.Dari API 21 , sangat mudah untuk mengubah warna bintang-bintang dengan tiga baris kode ini:
Melakukannya seperti ini, Anda akan berubah:
sumber
Jika Anda ingin mengubah warna untuk semua bintang menyatakan Anda gunakan saya:
sumber
Solusi yang diposkan Alex dan CommonsWares sudah benar. Satu hal yang tidak pernah dibicarakan oleh Android adalah ukuran piksel yang tepat untuk kepadatan yang berbeda. Berikut adalah dimensi yang diperlukan untuk setiap kerapatan berdasarkan cahaya halo.
Bintang Kecil
Bintang Sedang
Bintang Besar
sumber
Jadi saya telah berjuang dengan masalah ini selama dua jam dan saya telah datang dengan solusi yang berfungsi untuk semua versi API, di mana peringkat setengah bintang juga ditampilkan.
Anda memanggil metode dengan urutan drawable ini:
CATATAN: Anda juga harus menentukan atribut "max" dan "numStars" dalam XML, jika tidak setengah bintang tidak ditampilkan.
sumber
Mode.SRC_IN
atauMode.MULTIPLY
?Sekarang Anda dapat menggunakan DrawableCompat dari appcompat v22.1.0 dan seterusnya untuk secara dinamis mewarnai semua jenis digambar, berguna ketika Anda mendukung beberapa tema dengan satu set digambar. Sebagai contoh:
Ini kompatibel ke bawah ke API 4. Juga lihat posting blog Chris Banes di Support Libraries v22.1.0
Untuk ukuran dan bentuk yang sebenarnya, Anda perlu menentukan gaya baru dan daftar gambar yang dapat digambar untuk ukuran yang sesuai, seperti yang sudah dijawab orang lain di atas.
sumber
Gunakan
android:theme
atribut:styles.xml
layout.xml
sumber
Untuk hanya mengubah warna Rating bar dari xml: -
sumber
Untuk mengubah warna, Anda hanya perlu mengatur parameter android: progressTint
Untuk ukuran properti gaya.
sumber
Cara paling sederhana:
sumber
Membangun jawaban @ lgvalle.
Ini akan menjaga warna langkah pecahan.
sumber
gunakan warna Anda sendiri
sumber
Tanpa menambahkan gaya baru, Anda dapat menggunakan warna rona di dalamnya
RatingBar
sumber
Bekerja untuk Android di bawah dan di atas versi 21
Setelah beberapa penelitian saya datang dengan metode ini untuk mengatur warna latar belakang, warna celah (misalnya: setengah bintang) dan warna warna bintang.
sumber
Solusi sederhana, gunakan AppCompatRatingBar dan metode setProgressTintList untuk mencapai ini, lihat jawaban ini untuk referensi.
sumber
Saya mengatasi masalah ini sebagai berikut:
sumber
bagi saya ini berfungsi ....
sumber
Saya menemukan solusi sederhana untuk mengubah warna bintang sesuai dengan tema Anda.
Masuk situs ini: http://android-holo-colors.com/
Pilih warna tema Anda dan buat gambar bintang Anda dibuat.
sumber
Dengan menggunakan jawaban di atas, saya membuat metode statis cepat yang dapat dengan mudah digunakan kembali. Ini hanya bertujuan untuk mewarnai warna progres untuk bintang yang diaktifkan. Bintang-bintang yang tidak diaktifkan tetap berwarna abu-abu.
Cukup lewati bilah penilaian dan Warna Anda menggunakan
getResources().getColor(R.color.my_rating_color)
Seperti yang Anda lihat, saya menggunakan DrawableCompat sehingga kompatibel dengan backward.
EDIT: Metode ini tidak berfungsi pada API21 (lihat gambar mengapa). Anda berakhir dengan NullPointerException saat memanggil setProgressBar. Saya akhirnya menonaktifkan seluruh metode pada API> = 21.
Untuk API> = 21, saya menggunakan solusi SupperPuccio.
sumber
Rating bar digunakan secara otomatis pada waktu berjalan untuk mengubah warna pada bintang sentuh.
Pertama tambahkan gaya dalam file app \ src \ main \ res \ values \ styles.xml:
Kemudian bilah nilai Anda menambahkan tema seperti ini:
sumber
1) nyatakan xml ini
2) di style.xml
3)
6) peringkat aktif --- ambil gambar dengan warna gelap karena akan digunakan sebagai transparansi warna untuk peringkat yang berbeda
rating_inactive - mengambil gambar dengan ukuran yang sama dari gambar di atas dengan latar belakang yang terang..itu akan digunakan ketika tidak ada peringkat yang dipilih
sumber
Cara yang sangat mudah untuk mengubah warna batas bintang adalah menggunakan parameter xml:
dalam tampilan ratingBar. Nilai harus berupa kode heksadesimal untuk suatu warna.
sumber
Saya sedang mencari metode yang dapat diandalkan untuk melakukan ini hingga API 9 setidaknya. Solusi "casting to LayerDrawble" tampak seperti solusi berisiko bagi saya, dan ketika saya mengujinya pada ponsel Android pada 2.3, itu berhasil, tetapi panggilan ke DrawableCompat.setTint (...) tidak memiliki efek apa pun.
Kebutuhan untuk memuat aset yang dapat ditarik tampaknya juga bukan solusi yang baik bagi saya.
Saya memutuskan untuk membuat kode solusi saya sendiri yang merupakan kelas yang memperluas AppCompatRatingBar, menggunakan Drawable yang disesuaikan untuk menggambar bintang-bintang secara terprogram. Ini berfungsi dengan baik untuk kebutuhan saya, saya akan mempostingnya jika itu membantu siapa pun:
https://gist.github.com/androidseb/2b8044c90a07c7a52b4bbff3453c8460
Tautan lebih mudah karena Anda bisa mendapatkan file lengkap secara langsung, tetapi di sini adalah kode lengkap untuk berjaga-jaga:
sumber
Jawabannya agak terlambat tapi saya harap ini akan membantu beberapa orang.
Dan inilah tampilan WhiteRatingStar
Dengan ini bintang-bintang akan berwarna putih misalnya.
sumber
Gunakan tautan ini
Android RatingBar mengubah warna bintang
atur style Anda di dalam nilai / style (v-21);
sumber
Seperti yang disiratkan oleh jawaban sebelumnya, tidak mudah untuk mengubah warna dari bar penilaian. Bintang-bintang tidak ditarik secara pemrograman, mereka adalah gambar dengan ukuran tetap dan gradien warna tertentu. Untuk mengubah warna Anda harus membuat gambar bintang Anda sendiri dengan warna yang berbeda kemudian lanjutkan untuk membuat sumber daya XML Anda sendiri yang dapat ditarik dan meneruskannya ke peringkat kelasBar menggunakan setProgressDrawable (Drawable d) atau XML atribut android: progressDrawable.
sumber