【问题标题】:color a button when is clicked单击时为按钮着色
【发布时间】:2014-02-28 07:35:52
【问题描述】:

我正在为 Android 创建一个小型计算器。计算器的键盘是由 OnDraw 中的 Java 代码创建的:

public void onDraw(Canvas canvas){
    buttonH = height/rows;
    Paint paint = new Paint();
    paint.setTextAlign(Paint.Align.CENTER);
    AssetManager assetManager = getResources().getAssets();
        Typeface tf = Typeface.create(Typeface.createFromAsset(assetManager,"fonts/font.ttf"),
    Typeface.NORMAL);

    paint.setTypeface(tf);
    paint.setAntiAlias(true);

    textSize = (width+height)/43;

    paint.setTextSize(textSize);
    paint.setColor(Color.rgb(0, 0, 0));

    Bitmap[][] buttons = new Bitmap[rows][];
    int spacing = (width+height)/400;

    LinearGradient gradient = new LinearGradient(buttonW/2,0,buttonW/2,buttonH,
                buttonShade,null,Shader.TileMode.REPEAT);

    for(int i = 0; i < rows; i++){
        int thisColumns = cScreen[i].length;
        buttons[i] = new Bitmap[thisColumns];
        buttonW = width/thisColumns;
        for(int j = 0; j < thisColumns; j++){

            buttons[i][j] = Bitmap.createBitmap(buttonW,buttonH,Bitmap.Config.ARGB_8888);
            Canvas temp = new Canvas(buttons[i][j]);
            paint.setShader(gradient1);
            RectF rect = new RectF(spacing,spacing,buttonW-spacing,buttonH-spacing);
            temp.drawRoundRect(rect, width/100,height/100,paint);
            paint.setShader(null);
            temp.drawText(cScreen[i][j],buttonW/2,(buttonH+textSize)/2,paint);
            canvas.drawBitmap(buttons[i][j], buttonW*j+shift,buttonH*i, paint);
        }
    }
}

但我想在单击按钮时为按钮区域着色

【问题讨论】:

  • 为按钮使用可绘制资源stackoverflow.com/a/2668538/2181456 .onDraw 成本更高
  • 按钮被创建为位图而不是 xml
  • 如果您对按钮使用透明位图并自己绘制背景,IMO 会更容易。如果你在布局上使用普通按钮,它会更容易。
  • 不能只画onTouchEvent(MotionEvent事件)中按钮的区域吗?

标签: java android view touch-event ondraw


【解决方案1】:

如果您只想在按下按钮时为按钮着色,您可以使用 xml 来实现。

   <?xml version="1.0" encoding="utf-8"?> 
   <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
      <item android:state_focused="true" android:state_pressed="true" 
            android:drawable="@drawable/bg_clolor_highlight" /> 
      <item android:state_focused="false" android:state_pressed="true" 
            android:drawable="@drawable/bg_clolor_highlight" /> 
      <item android:drawable="@drawable/bg_clolor_normal" /> 
  </selector>

否则你可以在按钮上调用 .setBackgroundColor(your_color)。

【讨论】:

  • 按钮被创建为位图而不是 xml
  • @bisssi 建议在 xml 中创建按钮。更容易,更易于维护。当然,如果您不是在 Canvas 中学习绘画。
【解决方案2】:

在 onDraw 中为点击的按钮创建一个不同的 Paint 对象:

 Paint p=new Paint(); 
 paint.setColor(Color.RED);

获取画布上点击位置的坐标:

在构造函数中附加一个 onTouch listener()

float x,y;

this.setOnTouchListener(new OnTouchListener() {
     @Override
     public boolean onTouch(View arg0, MotionEvent event) {
          x=event.getX();y=event.getY();
     }
});

在 onDraw 中:

    Paint p=new Paint(); 
    paint.setColor(Color.RED);
for(int i = 0; i < rows; i++){
    int thisColumns = cScreen[i].length;
    buttons[i] = new Bitmap[thisColumns];
    buttonW = width/thisColumns;

    for(int j = 0; j < thisColumns; j++){
        Paint tempPaint;
         if(x> buttonW*j+shift&&x< buttonW*j+shift+buttonW&&y>buttonH*i&&y<buttonH*i+buttonH) 
         tempPaint=p;
         else
         tempPaint=paint;
        buttons[i][j] = Bitmap.createBitmap(buttonW,buttonH,Bitmap.Config.ARGB_8888);
        Canvas temp = new Canvas(buttons[i][j]);
        tempPaint.setShader(gradient1);
        RectF rect = new RectF(spacing,spacing,buttonW-spacing,buttonH-spacing);
        temp.drawRoundRect(rect, width/100,height/100,tempPaint);
        tempPaint.setShader(null);
        temp.drawText(cScreen[i][j],buttonW/2,(buttonH+textSize)/2,tempPaint);

        canvas.drawBitmap(buttons[i][j], buttonW*j+shift,buttonH*i, tempPaint);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2018-01-06
    • 2012-12-06
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多