Холст (onDraw) Android

Я пытался нарисовать разные прямоугольники на холсте после нескольких нажатий кнопки. Он должен отображать прямоугольник другого цвета, и прямоугольник должен оставаться на холсте после каждого нажатия кнопки. Прямоугольники должны иметь возможность перемещаться по холсту. Я написал класс View, но понятия не имею, как реализовать метод onDraw() для активности после нажатия кнопки, а также не знаю, как создать другой цвет прямоугольника.

У меня есть 4 кнопки в файле main.xml.

public class DrawRectangle extends View {

public DrawRectangle(Context context){

    super(context);

}

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);

    Rect ourRect = new Rect();

    ourRect.set(0, 0, canvas.getWidth()/2, canvas.getHeight()/2);

    Paint blue = new Paint();

    blue.setColor(Color.BLUE);

    blue.setStyle(Paint.Style.FILL);

    //Draw to actual canvas
    canvas.drawRect(ourRect, blue);

}

}

Это мой класс активности.

public class MainActivity extends Activity {

Button bluebutton, redbutton, yellowbutton, greenbutton;
DrawRectangle dr;
Canvas canvas;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    dr = new DrawRectangle(this);

    bluebutton = (Button)findViewById(R.id.bluebutton);
    redbutton = (Button)findViewById(R.id.redbutton);
    yellowbutton = (Button)findViewById(R.id.yellowbutton);
    greenbutton = (Button)findViewById(R.id.greenbutton);



bluebutton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

                dr.onDraw();
    }
});
}

}

Должен ли я также реализовать onTouchListener, чтобы прямоугольники могли перемещаться?

Пожалуйста посоветуй. Спасибо.


person pancakeleh    schedule 17.12.2013    source источник


Ответы (2)


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

public static boolean isBlue, isRed, isYellow, isGreen;
public class MainActivity extends Activity {

    Button bluebutton, redbutton, yellowbutton, greenbutton;
    DrawRectangle dr;
    Canvas canvas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    dr = new DrawRectangle(this);

    bluebutton = (Button)findViewById(R.id.bluebutton);
    redbutton = (Button)findViewById(R.id.redbutton);
    yellowbutton = (Button)findViewById(R.id.yellowbutton);
    greenbutton = (Button)findViewById(R.id.greenbutton);

    boolean blueColor = false;
    bluebutton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        isBlue = true;
        isRed = false;
        isGreen = false;
        isYellow = false;
        dr.invalidate();
    }
    });
}

Обновите метод onDraw, чтобы проверить, какой цвет рисовать.

//Used for storing rectangles        
public static List<Rect> rectangles;
public class DrawRectangle extends View {

    public DrawRectangle(Context context){

    super(context);

}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    //Draw previous rectangles
    for(int i=0;i<rectangles.size();i++){
        canvas.drawRect(rectangles.get(i), paintColor );
    }
    Rect ourRect = new Rect();

    ourRect.set(0, 0, canvas.getWidth()/2, canvas.getHeight()/2);

    Paint paintColor = new Paint();

    if(MainActivity.isBlue){
        paintColor.setColor(Color.BLUE);
    }

    paintColor.setStyle(Paint.Style.FILL);

    //Draw to actual canvas
    canvas.drawRect(ourRect, paintColor );
    rectangles.add(ourRect)

} }

Чтобы нарисовать больше прямоугольников, вы должны сохранить ранее нарисованные прямоугольники в векторе и перебирать его каждый раз, когда вы делаете недействительным метод onDraw.

person industrychanger    schedule 17.12.2013
comment
спасибо за ваш ответ и совет. Я внес поправки в свои коды, но при нажатии кнопки прямоугольник не рисуется. Вопрос, нужно ли указывать SurfaceView в моем xml? - person pancakeleh; 18.12.2013
comment
Я установил setContentView(); быть = setContentView (д-р); и прямоугольник нарисован. однако 4 кнопки пропали. Как сохранить и кнопки, и прямоугольник? - person pancakeleh; 18.12.2013
comment
Не могли бы вы предоставить файл main.xml, пожалуйста? - person industrychanger; 18.12.2013
comment
мне удалось заставить это работать. Если вы не возражаете, не могли бы вы уточнить вектор для хранения ранее нарисованной части прямоугольника? Я могу использовать List‹Rect› ListOfRect = new ArrayList‹Rect›(); или Rectangle r = new Rectangle(); хранить? Я также могу использовать этот метод для хранения изображений, верно? - person pancakeleh; 19.12.2013
comment
Кроме того, прямо сейчас прямоугольник появляется только один раз при нажатии кнопки. Как я могу закодировать его таким образом, чтобы даже при двойном нажатии кнопки появлялись два прямоугольника? - person pancakeleh; 19.12.2013
comment
List‹Rect› отлично подойдет для того, что вам нужно. Каждый раз, когда вы аннулируете холст, вы можете перебирать ArrayList и снова рисовать прямоугольники. Я обновил свой ответ некоторым кодом, показывающим возможный способ сделать это. - person industrychanger; 19.12.2013
comment
я видел вашу обновленную версию вашего ответа, и я попробовал ее. Но это не работает :( Может ли быть так, что новый прямоугольник перекрывается со старым, поэтому я не вижу второй добавленный прямоугольник? - person pancakeleh; 21.12.2013
comment
@pancakeleh прямоугольники могут перекрываться. Если вам нужно, я могу создать пример проекта github, который предоставит вам запрашиваемую вами функциональность. Просто дай мне знать. - person industrychanger; 27.12.2013
comment
Да, пожалуйста. Я самостоятельно изучаю разработку приложений для Android и надеюсь, что вы сможете мне помочь. Спасибо :) - person pancakeleh; 27.12.2013

да, вы должны onTouchEvent в своем подклассе представления. документацию можно прочитать здесь. Параметр события содержит информацию о типе касания, которое вы получаете (ACTION_DOWN, ACTION_MOVE, ACTION_UP), а также содержит координаты событий касания. Когда вы получаете событие ACTION_MOVE, вы можете изменить положение прямоугольника и вызвать invalidate() для перерисовки. Пожалуйста, избавьтесь от вызова отрисовки внутри onClickListener в вашей деятельности.

person Blackbelt    schedule 17.12.2013