不同的文字颜色为每类对象? [英] Different text color for each class object?

查看:202
本文介绍了不同的文字颜色为每类对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在做某种游戏得分的追踪者。这里的应用程序目前是如何工作的:

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


  1. 用户键入一个名称的EditText,然后单击确定按钮,增加了球员。

  2. 在用户完成添加新的球员,他presses开始游戏按钮和一个新的活动打开。

  3. 玩家加入到Parcelable额外并被带到下一个活动。

  4. 在接下来的活动中,用户有一个旋转器的EditText和+, - 按键。之后,用户选择从离心器在一定分数一定播放机,类型,然后任一个+或 - ,一个新的TextView将出现包含播放器名称和评分

例如:如果有3名球员詹姆斯,约翰和罗伯特。然后,用户增加了5分詹姆斯10分,约翰和15分罗伯特。这是TextViews怎么会是这样的:

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:

詹姆斯5

约翰福音10

15罗伯特

然后,如果用户将再次做完全相同的事情,会出现这种情况:

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

詹姆斯5

约翰福音10

15罗伯特

10詹姆斯

约翰福音20

30罗伯特

因此​​,大家可以看到,我不要让每个玩家在同一TextView的,但我一直将他们(我希望如此,我希望用户能够看到他的行动,当他点击 - 和+时但有没有以某种方式为每个用户设置颜色的方法举例:??詹姆斯会是蓝色的,约翰将是红色和罗伯特将是绿色的我如何pre-确定每个玩家的TextView的颜色

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类:

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];
        }
    };
}

我可以添加某种调色板到活动正在增加球员时,使用户可以pre-确定一种颜色的东西?

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?

推荐答案

下面是一个颜色选择器,Android的犯规有一个内置的,随意修改它以您的需求。

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");

    }
}

然后当你从colorchangelistener整型的颜色,当他们选择,或者如果它使用默认或任何INT保存到播放器

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

编辑:我想我剥默认了这一个,因为它不跨设备扩展太好了,这是我不能记住,你可能会瓦纳经历,并检查,它的工作原理虽然
你需要一个按钮或东西触发颜色选择器

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

在您的活动

import "your package name".ColorPickerDialog

然后让你的活动

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();

您应该能够覆盖,因为你实现OnColorChangeListener方法是

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);
}

我只是有paint.setColor()在那里,但你可以保存INT颜色女巫颜色选择器中选择您的播放器类的颜色,并用它在你的textviews文本颜色。

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.

这篇关于不同的文字颜色为每类对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆