2013-08-30 2 views
0

Вот предыдущий вопрос: How to create a resizable rectangle with user touch events on Android?Последующий для рисования изменяемого прямоугольник

Забудьте о перемещении прямоугольника, сам прямоугольник не втянуться. Ниже мой код. Я не получаю никаких ошибок, но я не вижу прямоугольника или углов.

public class DrawView extends View { 
    private Paint paint; 
    private ArrayList<ColorBall> colorballs = new ArrayList<ColorBall>(); 
    private int groupID = -1; 
    private int ballID = 0; 
    private Canvas canvas; 
    Point[] pts = new Point[4]; 
    int left, top, right, bottom; 
    private Bitmap bm; 
    private BitmapDrawable bmDrawable; 

    public DrawView(Context context) { 
     super(context); 
     paint = new Paint(); 
     setFocusable(true); 
     canvas = new Canvas(); 
    } 

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

    public DrawView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     paint = new Paint(); 
     setFocusable(true); 
     canvas = new Canvas(); 
    } 

    // -------------------------------------------------------------------// 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     //super.onDraw(canvas); 
     this.setBackgroundColor(Color.LTGRAY); 
     paint.setStrokeWidth(5); 
     paint.setColor(Color.GREEN); 

     if (pts[3] == null) { 
      return; 
     } 
     int left, top, right, bottom; 
     left = pts[0].x; 
     top = pts[0].y; 
     right = pts[0].x; 
     bottom = pts[0].y; 

     for (int i = 1; i < pts.length; i++) { 
      left = left > pts[i].x ? pts[i].x : left; 
      top = top > pts[i].y ? pts[i].y : top; 
      right = right < pts[i].x ? pts[i].x : right; 
      bottom = bottom < pts[i].y ? pts[i].y : bottom; 
     } 

     paint.setAntiAlias(true); 
     paint.setDither(true); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     paint.setStrokeWidth(5); 

     // draw stroke 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setColor(Color.parseColor("#AADB1255")); 
     paint.setStrokeWidth(2); 

     canvas.drawRect(left + colorballs.get(0).getWidthOfBall()/2, 
       top + colorballs.get(0).getWidthOfBall()/2, 
       right + colorballs.get(2).getWidthOfBall()/2, 
       bottom + colorballs.get(2).getWidthOfBall()/2, paint); 

     //fill the rectangle 
     paint.setStyle(Paint.Style.FILL); 
     paint.setColor(Color.parseColor("#55DB1255")); 
     paint.setStrokeWidth(0); 

     canvas.drawRect(left + colorballs.get(0).getWidthOfBall()/2, 
       top + colorballs.get(0).getWidthOfBall()/2, 
       right + colorballs.get(2).getWidthOfBall()/2, 
       bottom + colorballs.get(2).getWidthOfBall()/2, paint); 



     // draw corners 
     bm = BitmapFactory.decodeResource(getResources(), R.drawable.circle); 
     bmDrawable = new BitmapDrawable(getResources(), bm); 

     // draw balls on canvas 
     paint.setColor(Color.BLUE); 
     paint.setTextSize(15); 
     paint.setStrokeWidth(0); 

     for (int i = 0; i < colorballs.size(); i++) { 
      ColorBall ball = colorballs.get(i); 
      canvas.drawBitmap(bmDrawable.getBitmap(), ball.getX(), ball.getY(), paint); 
      canvas.drawText("" + (i + 1), ball.getX(), ball.getY(), paint); 
     } 
    } 



} 

Вот XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <View 
     android:id="@+id/drawview" 
     android:layout_width="fill_parent" 
     android:layout_height="match_parent" 
     class="com.example.androiddraw.DrawView" /> 

</RelativeLayout> 

У меня есть класс ColorBall со всеми соответствующими сеттеров и добытчиками. Что мне не хватает?

Заранее спасибо.

ответ

0

Посмотрев на свой код, я вижу, что вы вызываете «this.setBackgroundColor (Color.LTGRAY)»; в методе onDraw. Задайте это в своем конструкторе, потому что, как вы это делаете, вызов setBackgroundColor приведет к недействительности вашего макета и вызовет перерисовку. Вы можете перейти к рекурсивной недействительности, рисованию, недействительности, рисованию ситуации. Посмотрите, поможет ли это.

Если это не исправить вашу проблему, вам может потребоваться глубже изучить ваш метод onDraw. Попробуйте начать с малого, чтобы увидеть, правильно ли отображаются части вашего кода в предварительном просмотре макета.

Еще одна вещь, которую нужно проверить, - убедиться, что в вашем Activity.onCreate() вы устанавливаете setContentView (R.layout ..). Иногда мы забываем и удивляемся, почему на экране ничего нет.

Наконец, я видел больше пользовательских макетов, определенных ниже. Возможно, вы можете попробовать этот синтаксис.

<com.example.androiddraw.DrawView 
    android:id="@+id/drawview" 
    android:layout_width="fill_parent" 
    android:layout_height="match_parent" 
/> 

Надеюсь, это поможет.

+0

спасибо WindsurferOak. У проблемы OnDraw была проблема. Исправлено, и теперь он работает отлично. – siriD