在其他类中更改int时更改颜色

时间:2014-05-22 10:02:02

标签: android

我有IndicationBar类,它应该绘制带有徽标的矩形和int值更改矩形颜色。我是java和android的新手,所以我每天都在学习。 此时int的值在其他类中发生变化,我称之为BluetoothChat.statusSviesos。它的public static int。我是否需要创建接口监听器或者每次更改int时如何运行private void Sviesos()?它在开始时只运行一次。

public class IndicationBar extends View {


    private static final String TAG = IndicationBar.class.getSimpleName();

    // drawing tools
    private RectF Rect;
    private Paint rectPaint;
    private Paint rimCirclePaint;

    private RectF faceRect;
    private Bitmap faceTexture;
    private Paint facePaint;
    private Paint rimShadowPaint;
    private Paint titlePaint;   
    private Path titlePath;

    private Paint logoPaint;
    private Bitmap logo;
    private Matrix logoMatrix;
    private float logoScale;

    private Paint backgroundPaint; 
    // end drawing tools

    private Bitmap background; // holds the cached static part



    public IndicationBar(Context context) {
        super(context);
        init();
    }

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

    public IndicationBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }


    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        Bundle bundle = (Bundle) state;
        Parcelable superState = bundle.getParcelable("superState");
        super.onRestoreInstanceState(superState);

    }

    private void init() {
        initDrawingTools();
    }

//  private String getTitle() {
//      return "DANCER";
//  }

    private void Sviesos(){
        //Rect = new RectF(0.1f, 0.1f, 0.9f, 0.9f);
        //rectPaint = new Paint();
        //valueSviesos = BluetoothChat.statusSviesos;
        switch(BluetoothChat.statusSviesos){
        case 0 : rectPaint.setColor(Color.parseColor("#1BA1E2"));
        break;
        case 1 : rectPaint.setColor(Color.parseColor("#A05000"));
        break;
        case 2 : rectPaint.setColor(Color.parseColor("#E671B8"));
        break;
        case 3 : rectPaint.setColor(Color.parseColor("#F09609"));
        break;
        case 4 : rectPaint.setColor(Color.parseColor("#1BA1E2"));
        break;
        }
        //rectPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
    }


    private void initDrawingTools() {
        Rect = new RectF(0.1f, 0.1f, 0.9f, 0.9f);
        rectPaint = new Paint();    
        rectPaint.setColor(Color.parseColor("#8CBF26"));
        rectPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
        Sviesos();

        rimCirclePaint = new Paint();
        rimCirclePaint.setAntiAlias(true);
        rimCirclePaint.setStyle(Paint.Style.STROKE);
        rimCirclePaint.setColor(Color.argb(0x4f, 0x33, 0x36, 0x33));
        rimCirclePaint.setStrokeWidth(0.005f);

        float rimSize = 0.02f;
        faceRect = new RectF();
        faceRect.set(Rect.left + rimSize, Rect.top + rimSize, 
                Rect.right - rimSize, Rect.bottom - rimSize);       

        faceTexture = BitmapFactory.decodeResource(getContext().getResources(), 
                   R.drawable.plastic);
        BitmapShader paperShader = new BitmapShader(faceTexture, 
                                                    Shader.TileMode.MIRROR, 
                                                    Shader.TileMode.MIRROR);
        Matrix paperMatrix = new Matrix();
        facePaint = new Paint();
        facePaint.setFilterBitmap(true);
        paperMatrix.setScale(1.0f / faceTexture.getWidth(), 
                             1.0f / faceTexture.getHeight());
        paperShader.setLocalMatrix(paperMatrix);
        facePaint.setStyle(Paint.Style.FILL);
        facePaint.setShader(paperShader);

        rimShadowPaint = new Paint();
        rimShadowPaint.setShader(new RadialGradient(0.5f, 0.5f, faceRect.width() / 2.0f, 
                   new int[] { 0x00000000, 0x00000500, 0x50000500 },
                   new float[] { 0.96f, 0.96f, 0.99f },
                   Shader.TileMode.MIRROR));
        rimShadowPaint.setStyle(Paint.Style.FILL);

        titlePaint = new Paint();
        titlePaint.setColor(Color.parseColor("#1BA1E2"));
        titlePaint.setAntiAlias(true);
        titlePaint.setTypeface(Typeface.DEFAULT_BOLD);
        titlePaint.setTextAlign(Paint.Align.CENTER);
        titlePaint.setTextSize(0.09f);
        titlePaint.setTextScaleX(0.9f);

        titlePath = new Path();
        titlePath.addArc(new RectF(0.24f, 0.24f, 0.76f, 0.76f), -180.0f, -180.0f);

        logoPaint = new Paint();
        logoPaint.setFilterBitmap(true);
        logo = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.sviesos);
        logoMatrix = new Matrix();
        logoScale = (1.0f / logo.getWidth()) * 0.3f;;
        logoMatrix.setScale(logoScale, logoScale);

        backgroundPaint = new Paint();
        backgroundPaint.setFilterBitmap(true);
    }



    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.d(TAG, "Width spec: " + MeasureSpec.toString(widthMeasureSpec));
        Log.d(TAG, "Height spec: " + MeasureSpec.toString(heightMeasureSpec));

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

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

        int chosenWidth = chooseDimension(widthMode, widthSize);
        int chosenHeight = chooseDimension(heightMode, heightSize);

        int chosenDimension = Math.min(chosenWidth, chosenHeight);

        setMeasuredDimension(chosenDimension, chosenDimension);
    }

    private int chooseDimension(int mode, int size) {
        if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {
            return size;
        } else { // (mode == MeasureSpec.UNSPECIFIED)
            return getPreferredSize();
        } 
    }

    // in case there is no size specified
    private int getPreferredSize() {
        return 300;
    }

    private void drawRect(Canvas canvas) {
        // first, draw the metallic body

        canvas.drawRect(Rect, rectPaint);
        // now the outer rim circle
        //canvas.drawOval(rimRect, rimCirclePaint);
    }

//  private void drawFace(Canvas canvas) {      
//      canvas.drawOval(faceRect, facePaint);
//      // draw the inner rim circle
//      canvas.drawOval(faceRect, rimCirclePaint);
//      // draw the rim shadow inside the face
//      canvas.drawOval(faceRect, rimShadowPaint);
//  }

    private void drawBackground(Canvas canvas) {
        if (background == null) {
            Log.w(TAG, "Background not created");
        } else {
            canvas.drawBitmap(background, 0, 0, backgroundPaint);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        drawBackground(canvas);

        float scale = (float) getWidth();       
        canvas.save(Canvas.MATRIX_SAVE_FLAG);
        canvas.scale(scale, scale);

        drawLogo(canvas);

        canvas.restore();
    }

    private void drawLogo(Canvas canvas) {
        canvas.save(Canvas.MATRIX_SAVE_FLAG);
        canvas.translate(0.5f - logo.getWidth() * logoScale / 2.0f, 
                         0.5f - logo.getHeight() * logoScale / 2.0f);
        canvas.drawBitmap(logo, logoMatrix, logoPaint);
        canvas.restore();       
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        Log.d(TAG, "Size changed to " + w + "x" + h);

        regenerateBackground();
    }

    private void regenerateBackground() {
        // free the old bitmap
        Sviesos();
        if (background != null) {
            background.recycle();
        }

        background = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
        Canvas backgroundCanvas = new Canvas(background);
        float scale = (float) getWidth();       
        backgroundCanvas.scale(scale, scale);

        drawRect(backgroundCanvas);     
    }


}

1 个答案:

答案 0 :(得分:1)

使用观察者模式。更改BluetoothChat

public class BluetoothChat {

  private static int statusSviesos;

  //the list of observers
  private static List<Observer> observerList;

  //adds an observer to observe statusSciesos
  public static void addStatusSviesosObserver(Observer observer) {
      observerList.add(observer);
  }

  //getter function returns the value
  public static int getStatusSviesos(){
      return statusSviesos;
  }

  //setter function sets the value and notifies observer
  public static void setStatusSviesos(int statusSviesos){
      BluetoothChat.statusSviesos=statusSviesos;
      for(Observer current: observerList){
          current.notifyChange(statusSviesos);
      }
  }

  public static interface Observer {
      public void notifyChange(int newStatus);
  }
...

然后在IndicationBar中创建一个Observer并将其添加到BluetoothChat:

Observer observer = new Observer() {
     @Override
     public void notifyChange(int newStatus) {
         Sviesos();
     }
};
BluetoothChat.addStatusSviesosObserver(observer);

这是Observer模式的原始实现。应该有一个removeObserver方法,它不是线程安全的。 Java中有一个默认的实现(Observer-class和Observable-class),还有像PropertyChangeObserver这样的替代实现。但对于您当前的用例,这应该可以胜任。另请阅读WikipediaVogellas tutorial

一般提示:

  • BluetoothChat的属性真的必须是静态的吗?我建议你尽可能少地使用静态。更好地创建一次对象并传递它。您可以搜索&#34;全球州&#34;以及为什么要避免它以获取进一步的信息。
  • 您可以创建一个颜色数组(或颜色字符串,如&#34;#F09609&#34;)并使用int来访问它,以摆脱switch语句。
  • 尝试在任何地方应用代码样式约定,方法名称和变量应始终以小写字母开头(除了常量为ALL_BIG)并且应该是描述性的。