2014-10-23 5 views
0

Я пытаюсь создать пользовательский вид, который заполняет и пуст определенным цветом, но он не работает. Я новичок в создании пользовательских представлений программным способом, поэтому, если могут быть некоторые ошибки «здравого смысла».Пользовательский вид В Android с использованием SurfaceView

код:

общественный класс PitchView расширяет SurfaceView реализует SurfaceHolder.Callback {

private int width, height; 
private final Paint paint = new Paint(); 
private int cx; 
private int cy; 

public PitchView(Context context) { 
    super(context); 
} 

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

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

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    // TODO Auto-generated method stub 
    width = MeasureSpec.getSize(widthMeasureSpec); 
    height = MeasureSpec.getSize(heightMeasureSpec); 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    cx = 0; 
    cy = 0; 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    width = w; 
    height = h; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    paint.setStrokeWidth((float) width); 
    paint.setColor(Color.WHITE); 
    canvas.drawLine(0, 0, width, height, paint); 
    paint.setColor(Color.BLUE); 
    canvas.drawLine(0, 0, cx, cy, paint); 
} 

Thread t = new Thread(new Runnable() { 

    private boolean moveUp = true; 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     try { 
      while (true) { 
       if (cx >= width) { 
        moveUp = false; 
       } else if (cx <= 0) { 
        moveUp = true; 
       } 
       if (moveUp) 
        cy++; 
       else 
        cy--; 
       Thread.sleep(500); 
       postInvalidate(); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      Log.e("PitchView Error", e.getMessage(), e); 
     } 
    } 
}); 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    t.start(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    t.interrupt(); 
} 

}

ответ

0

Вам не нужно переопределить метод OnDraw, все рисования код может написать в нить, таким образом вы можете рисовать сложную графику, не прерывая основной поток. SurfaceView - это специальный подкласс View, который предлагает выделенную поверхность чертежа в иерархии View. Цель состоит в том, чтобы предложить эту поверхность рисования второму потоку приложения, чтобы приложение не требовалось ждать, пока иерархия представления системы будет готова к рисованию. Вместо этого вторичный поток, который ссылается на SurfaceView, может по своему собственному ритму рисовать на собственный холст.

Thread t = new Thread(new Runnable() { 

private boolean moveUp = true; 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    try { 
     while (true) { 
      if (cx >= width) { 
       moveUp = false; 
      } else if (cx <= 0) { 
       moveUp = true; 
      } 
      if (moveUp) 
       cy++; 
      else 
       cy--; 
       //Here you can draw graphics 
       Canvas canvas = surfaceHolder.lockCanvas(); 
       paint.setStrokeWidth((float) width); 
       paint.setColor(Color.WHITE); 
       canvas.drawLine(0, 0, width, height, paint); 
       paint.setColor(Color.BLUE); 
       canvas.drawLine(0, 0, cx, cy, paint); 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      Thread.sleep(500); 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     Log.e("PitchView Error", e.getMessage(), e); 
    } 
} 

});

private SurfaceHolder surfaceHolder = null; 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    surfaceHolder = holder; 
    t.start(); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int frmt, int w, int h) { 
    surfaceHolder = holder; 
} 
+0

Спасибо за ответ. Как мы пройдем surfaceHolder для потока объекта t? Это дает мне ошибку на поверхности. –

+0

Обновленный ответ, код здесь не подходит – mes

+0

Спасибо за его работу. Я также пропустил getHolder(). AddCallback (this); оператор в конструкторе. –