18842

Different text color for each class object?

I'm making some kind of "game score tracker". Here's how the app currently works:

<ol> <li>User adds players by typing a name into EditText and then clicking ok button.</li> <li>After the user finished adding new players, he presses "start game" button and a new activity opens.</li> <li>Players are added to Parcelable extra and taken to the next activity.</li> <li>In the next activity, a user has a spinner, EditText and +, - buttons. After the user selects a certain player from the spinner, types in a certain score and then either a + or -, a new TextView will appear containing Player name and score.</li> </ol>

Example: If there are 3 Players "James, John and Robert". The user then adds 5 points to James, 10 points to John and 15 points to Robert. This is how TextViews will look like:

James 5

John 10

Robert 15

Then if user will do the exactly same thing again, this will happen:

James 5

John 10

Robert 15

James 10

John 20

Robert 30

So as you can see, I don't keep the same TextView for each player but I keep adding them (I do want that, I want the user to be able to see his actions, when he clicked - and when +. But is there a way to somehow set a color for each user? Example: James will be blue, John will be red and Robert will be green. How do I pre-determine the color of each Player's TextView?

Player class:

public static class Player implements Parcelable{ String name; int score; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(score); dest.writeString(name); } public Player(Parcel source){ score = source.readInt(); name = source.readString(); } public Player(){ } public static final Parcelable.Creator<Player> CREATOR = new Parcelable.Creator<Novaigra.Player>() { @Override public Player createFromParcel(Parcel source) { return new Player(source); } @Override public Player[] newArray(int size) { return new Player[size]; } }; }

Can I add some kind of color palette to the activity when players are being added so that a user can pre-determine a color or something?

Answer1:

here is a color picker, android doesnt have one built in, feel free to modify it to your needs

import android.app.Dialog; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Shader; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; public class ColorPickerDialog extends Dialog { public interface OnColorChangedListener { void colorChanged(String key, int color); } private OnColorChangedListener mListener; private int mInitialColor, mDefaultColor; private String mKey; private class ColorPickerView extends View { private Paint mPaint; private float mCurrentHue = 0; private int mCurrentX = 0, mCurrentY = 0; private int mCurrentColor, mDefaultColor; private final int[] mHueBarColors = new int[258]; private int[] mMainColors = new int[65536]; private OnColorChangedListener mListener; private int width,height; ColorPickerView(Context c, OnColorChangedListener l, int color, int defaultColor) { super(c); mListener = l; mDefaultColor = defaultColor; // Get the current hue from the current color and update the main // color field float[] hsv = new float[3]; Color.colorToHSV(color, hsv); mCurrentHue = hsv[0]; updateMainColors(); mCurrentColor = color; // Initialize the colors of the hue slider bar int index = 0; for (float i = 0; i < 256; i += 256 / 42) // Red (#f00) to pink // (#f0f) { mHueBarColors[index] = Color.rgb(255, 0, (int) i); index++; } for (float i = 0; i < 256; i += 256 / 42) // Pink (#f0f) to blue // (#00f) { mHueBarColors[index] = Color.rgb(255 - (int) i, 0, 255); index++; } for (float i = 0; i < 256; i += 256 / 42) // Blue (#00f) to light // blue (#0ff) { mHueBarColors[index] = Color.rgb(0, (int) i, 255); index++; } for (float i = 0; i < 256; i += 256 / 42) // Light blue (#0ff) to // green (#0f0) { mHueBarColors[index] = Color.rgb(0, 255, 255 - (int) i); index++; } for (float i = 0; i < 256; i += 256 / 42) // Green (#0f0) to yellow // (#ff0) { mHueBarColors[index] = Color.rgb((int) i, 255, 0); index++; } for (float i = 0; i < 256; i += 256 / 42) // Yellow (#ff0) to red // (#f00) { mHueBarColors[index] = Color.rgb(255, 255 - (int) i, 0); index++; } // Initializes the Paint that will draw the View mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setTextAlign(Paint.Align.CENTER); mPaint.setTextSize(12); } // Get the current selected color from the hue bar private int getCurrentMainColor() { int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); int index = 0; for (float i = 0; i < 256; i += 256 / 42) { if (index == translatedHue) return Color.rgb(255, 0, (int) i); index++; } for (float i = 0; i < 256; i += 256 / 42) { if (index == translatedHue) return Color.rgb(255 - (int) i, 0, 255); index++; } for (float i = 0; i < 256; i += 256 / 42) { if (index == translatedHue) return Color.rgb(0, (int) i, 255); index++; } for (float i = 0; i < 256; i += 256 / 42) { if (index == translatedHue) return Color.rgb(0, 255, 255 - (int) i); index++; } for (float i = 0; i < 256; i += 256 / 42) { if (index == translatedHue) return Color.rgb((int) i, 255, 0); index++; } for (float i = 0; i < 256; i += 256 / 42) { if (index == translatedHue) return Color.rgb(255, 255 - (int) i, 0); index++; } return Color.RED; } // Update the main field colors depending on the current selected hue private void updateMainColors() { int mainColor = getCurrentMainColor(); int index = 0; int[] topColors = new int[256]; for (int y = 0; y < 256; y++) { for (int x = 0; x < 256; x++) { if (y == 0) { mMainColors[index] = Color.rgb( 255 - (255 - Color.red(mainColor)) * x / 255, 255 - (255 - Color.green(mainColor)) * x / 255, 255 - (255 - Color.blue(mainColor)) * x / 255); topColors[x] = mMainColors[index]; } else mMainColors[index] = Color.rgb( (255 - y) * Color.red(topColors[x]) / 255, (255 - y) * Color.green(topColors[x]) / 255, (255 - y) * Color.blue(topColors[x]) / 255); index++; } } } @Override protected void onDraw(Canvas canvas) { int translatedHue = 255 - (int) (mCurrentHue * 255 / 360); // Display all the colors of the hue bar with lines for (int x = 0; x < 256; x++) { // If this is not the current selected hue, display the actual // color if (translatedHue != x) { mPaint.setColor(mHueBarColors[x]); mPaint.setStrokeWidth(1); } else // else display a slightly larger black line { mPaint.setColor(Color.BLACK); mPaint.setStrokeWidth(3); } canvas.drawLine(x + 10, 0, x + 10, 40, mPaint); // canvas.drawLine(0, x+10, 40, x+10, mPaint); //canvas.drawLine(x + width/27, 0, x + width/27,height/8 , mPaint); } // Display the main field colors using LinearGradient for (int x = 0; x < 256; x++) { int[] colors = new int[2]; colors[0] = mMainColors[x]; colors[1] = Color.BLACK; Shader shader = new LinearGradient(0, 50, 0, 306, colors, null, Shader.TileMode.REPEAT);//0,50,0,306 mPaint.setShader(shader); canvas.drawLine(x + 10, 50, x + 10, 306, mPaint); //canvas.drawLine(x + width/27, height/8 + 10, x + width/27, height*(5/6), mPaint); } mPaint.setShader(null); // Display the circle around the currently selected color in the // main field if (mCurrentX != 0 && mCurrentY != 0) { mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.BLACK); canvas.drawCircle(mCurrentX, mCurrentY, 10, mPaint); } // Draw a 'button' with the currently selected color mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mCurrentColor); //canvas.drawRect(10, 316, 138, 356, mPaint); //canvas.drawRect(width/27, height*(5/6), width/2, height, mPaint); // Set the text color according to the brightness of the color if (Color.red(mCurrentColor) + Color.green(mCurrentColor) + Color.blue(mCurrentColor) < 384) mPaint.setColor(Color.WHITE); else mPaint.setColor(Color.BLACK); // canvas.drawText( // "New Color", 74, //340, mPaint); // Draw a 'button' with the default color mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mDefaultColor); //canvas.drawRect(138, 316, 266, 356, mPaint); //canvas.drawRect(width/2, height*(5/6), width, height, mPaint); // Set the text color according to the brightness of the color if (Color.red(mDefaultColor) + Color.green(mDefaultColor) + Color.blue(mDefaultColor) < 384) mPaint.setColor(Color.WHITE); else mPaint.setColor(Color.BLACK); //canvas.drawText( // "Default Color", 202, 340, //mPaint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(276,366 );//276,366 width = widthMeasureSpec; height = heightMeasureSpec; } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() != MotionEvent.ACTION_DOWN) return true; float x = event.getX(); float y = event.getY(); // If the touch event is located in the hue bar if (x > 10 && x < 266 && y > 0 && y < 40) { // Update the main field colors mCurrentHue = (255 - x) * 360 / 255; updateMainColors(); // Update the current selected color int transX = mCurrentX - 10; int transY = mCurrentY - 60; int index = 256 * (transY - 1) + transX; if (index > 0 && index < mMainColors.length) mCurrentColor = mMainColors[256 * (transY - 1) + transX]; // Force the redraw of the dialog invalidate(); } // If the touch event is located in the main field if (x > 10 && x < 266 && y > 50 && y < 306) { mCurrentX = (int) x; mCurrentY = (int) y; int transX = mCurrentX - 10; int transY = mCurrentY - 60; int index = 256 * (transY - 1) + transX; if (index > 0 && index < mMainColors.length) { // Update the current color mCurrentColor = mMainColors[index]; mListener.colorChanged("", mCurrentColor); // Force the redraw of the dialog invalidate(); } } // If the touch event is located in the left button, notify the // listener with the current color //if (x > 10 && x < 138 && y > 316 && y < 356) // mListener.colorChanged("", mCurrentColor); // If the touch event is located in the right button, notify the // listener with the default color //if (x > 138 && x < 266 && y > 316 && y < 356) // mListener.colorChanged("", mDefaultColor); return true; } } public ColorPickerDialog(Context context, OnColorChangedListener listener, String key, int initialColor, int defaultColor) { super(context); mListener = listener; mKey = key; mInitialColor = initialColor; mDefaultColor = defaultColor; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); OnColorChangedListener l = new OnColorChangedListener() { public void colorChanged(String key, int color) { mListener.colorChanged(mKey, color); dismiss(); } }; setContentView(new ColorPickerView(getContext(), l, mInitialColor, mDefaultColor)); setTitle("Pick Text Color"); } }

then when you get the int color from the colorchangelistener when they pick or if it uses the default or whatever save the int into the player

EDIT: i think i stripped the default out of this one because it doesnt scale too well across devices, something i cant remember, you might wana go through it and check, it works though you need a button or something to trigger the color picker

in your activity

import "your package name".ColorPickerDialog

then make your activity

implement OnColorChangeListener

then in the button for the color picker to come up

ColorPickerDialog color = new ColorPickerDialog(this,this, "picker",Color.BLACK,Color.WHITE); color.show();

the method you should be able to override because you implemented OnColorChangeListener is

@Override public void colorChanged(String key, int color) { // TODO Auto-generated method stub paint.setColor(color); }

i just have paint.setColor() in there but you can save the int color witch is the color selected in the color picker to your Player class and use it for the text color in your textviews.

Answer2:

You can show a color picker dialog to let the user choose a color. Color picker dialog and example of how to use it can be found here: https://github.com/chiralcode/Android-Color-Picker/

Recommend

  • Group variable in cobol
  • R h2o.glm - issue with max_active_predictors
  • dismiss Progress Dialog in another Activity … Android
  • Winforms: Add a close “x” button in a UserControl
  • How to remove all of a jQuery UI dialog when it is closed
  • How can go in last activity with resume button?
  • Getting short path in python
  • Access user's phone number on iOS 7
  • DIV instruction jumping to random location?
  • Elasticsearch script query involving root and nested values
  • Why use database factory in asp.net mvc?
  • How do I configure context broker accept post requests from my remote sensor?
  • Using JRuby with Rails 3.2
  • Using a canvas object in a thread to do simple animations - Java
  • How can I speed up CURL tasks?
  • Moving Android View and preventing onDraw to be called over and over again
  • Visual Studio 2010 debugger build correctly - compiler pdb and linker pdb not in synch?
  • Ensure fsync did its job
  • Installing iPhone App to iPhone
  • How to use carriage return with multiple line?
  • why overloaded new operator is calling constructor even I am using malloc inside overloading functio
  • Alert pop up with LWUIT
  • Master page gives error
  • DotNetZip - Calculate final zip size before calling Save(stream)
  • JavaScriptCore crash on iOS9
  • Obtain ObjectIdHex value from mgo query
  • Javascript Callbacks with Object constructor
  • Can I have the cursor start on a particular column by default in jqgrid's edit mode?
  • Redux, normalised entities and lodash merge
  • Why winpcap requires both .lib and .dll to run?
  • Apache 2.4 - remove | delete | uninstall
  • Warning: Can't call setState (or forceUpdate) on an unmounted component
  • Return words with double consecutive letters
  • Cannot Parse HTML Data Using Android / JSOUP
  • Python: how to group similar lists together in a list of lists?
  • Load html files in TinyMce
  • Free memory of cv::Mat loaded using FileStorage API
  • How do you join a server to an Active Directory (domain)?
  • Understanding cpu registers
  • Busy indicator not showing up in wpf window [duplicate]