2015-01-16 8 views
1

Я работаю над ничьей. Я выполнил функцию отрисовки с помощью настраиваемого представления, как это:Как изменить параметр в пользовательском представлении во время выполнения?

public class DrawView extends View implements OnTouchListener { 

    private Paint bmPaint = new Paint(); 
    private Paint drawPaint = new Paint(); 
    private Path path = new Path(); 
    private Canvas cv = null; 
    private Bitmap bm = null; 
    private Drawable d; 
    private boolean firstTimeThru = true; 

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

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

    public void init(Context ctx) { 
     setFocusable(true); 
     setFocusableInTouchMode(true); 
     this.setOnTouchListener(this); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     // Set everything up the first time anything gets drawn: 
     if (firstTimeThru) { 
      firstTimeThru = false; 
      //d = getResources().getDrawable(R.drawable.zone0_over); 
      d = new ColorDrawable(Color.TRANSPARENT); 

      // Just quickly fill the view with a red mask:   
      canvas.drawColor(Color.TRANSPARENT); 

      // Create a new bitmap and canvas and fill it with a red mask: 
      bm = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),Config.ARGB_8888);   
      cv = new Canvas(); 
      cv.setBitmap(bm); 
      d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
      d.draw(cv); 

      // Specify that painting will be with fat strokes: 
      drawPaint.setStyle(Paint.Style.STROKE); 
      drawPaint.setColor(Color.RED); 
      drawPaint.setStrokeWidth(canvas.getWidth()/200); // default 15 

      // Specify that painting will clear the pixels instead of paining new ones: 
      drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD)); 
     } 

     cv.drawPath(path, drawPaint); 
     canvas.drawBitmap(bm, 0, 0, bmPaint); 

     super.onDraw(canvas); 
    } 

    public boolean onTouch(View view, MotionEvent event) { 
     float xPos = event.getX(); 
     float yPos = event.getY(); 

     switch (event.getAction()) { 
      // Set the starting position of a new line: 
      case MotionEvent.ACTION_DOWN: 
       path.moveTo(xPos, yPos); 
       invalidate(); 
      return true; 

      // Draw a line to the ending position: 
      case MotionEvent.ACTION_MOVE: 
       path.lineTo(xPos, yPos); 
       invalidate(); 
      break; 

      case MotionEvent.ACTION_UP: 
      break; 

      default: 
      return false; 
     } 

     return true; 
    } 

} 

И в XML, как это:

<ImageView 
    android:id="@+id/change_color_btn" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<com.myapp.tool.DrawView 
    android:id="@+id/draw" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Обратите внимание, что я установил размер линии и цвет линии внутри функции OnDraw, в настоящее время красный цвет, однако, я хотел бы нажать кнопку и изменить цвет на желтый, как я могу установить параметр во время выполнения?

Благодаря

ответ

2

Добавить переменную-член и сеттер функцию к классу DrawView:

private int mLineColor = Color.RED; 
public void setLineColor(int color) 
{ 
    mLineColor = color; 
    drawPaint.setColor(mLineColor); 
} 

Меняйте OnDraw использовать его:

drawPaint.setColor(mLineColor); 

Затем вы можете установить его в деятельности, которая использует свой собственный класс , внутри обработчика Button onClick():

DrawView drawview = (DrawView)findViewById(R.id.draw); 
drawView.setLineColor(Color.YELLOW); 
drawView.invalidate(); // trigger a redraw 

Аналогично для ширины хода.

1

кнопку Добавить в макете для переключения цвета и добавить clicklistener к нему. Затем вы можете изменить цвет своего пути. Вы хотите, чтобы текущий путь переключал цвет или только новый?

0

принимать значение field в настраиваемое представление, как mColor и создать setter and getter для значения поля, затем установите цвет после создания настраиваемого представления также, как это:

private int mColor; 

public int getmColor() { 
    return mColor; 
} 

public void setmColor(int mColor) { 
    this.mColor = mColor; 
    this.invalidate(); 
} 
+0

Вы должны установить цвет к краска для перерисовки с новым цветом. В противном случае никаких изменений не будет. –