2013-08-02 3 views
4

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

Heres Мои MainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
// EditText numDart = (EditText) findViewById(R.id.numDarts); 

    setContentView(R.layout.activity_main); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

public int convertToDpi(int px){ 
    DisplayMetrics metrics = getResources().getDisplayMetrics(); 
    int unit = metrics.widthPixels/20; 
    return px * unit; 
} 
public void drawCanvas(View v){ 
    View view = (View) findViewById(R.id.canView); 
    Paint black = new Paint(); 
    black.setColor(Color.BLACK); 
    black.setStyle(Style.FILL); 

    view.invalidate(); //dont know where to go from here 
} 

Heres Мой заказ Вид:

public CanView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 

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

    Rect myrect = new Rect(); 
    myrect.set(-10, 10, 10, -10); 

    Paint blue = new Paint(); 
    Paint white = new Paint(); 
    white.setColor(Color.WHITE); 
    white.setStyle(Paint.Style.FILL); 

    Paint black = new Paint(); 
    black.setColor(Color.BLACK); 
    black.setStyle(Paint.Style.FILL); 

    blue.setColor(Color.BLUE); 
    blue.setStyle(Paint.Style.FILL); 


    canvas.drawRect(myrect, blue); 
    canvas.drawCircle(convertToDpi(10), convertToDpi(10),convertToDpi(3), white); 
    canvas.drawLine(convertToDpi(10), 0, convertToDpi(10), convertToDpi(20), black); 
    canvas.drawLine(0, convertToDpi(10), convertToDpi(20), convertToDpi(10), black); 
    canvas.scale(5, 5, 0, 0); 
} 
@Override 
public void postInvalidate() { //Logic for redrawig goes here??? 
    // TODO Auto-generated method stub 
    super.postInvalidate(); 
} 

public int convertToDpi(int px){ 
    DisplayMetrics metrics = getResources().getDisplayMetrics(); 
    int unit = metrics.widthPixels/20; 
    return px * unit; 
} 

Я не понимаю, как ссылаться на холст из моего пользовательского просмотра и изменения или перерисовывать его. Im предполагая, что вы используете invalidate(); но я озадачен тем, как этот метод работает, может ли кто-нибудь помочь мне?

ответ

1

Когда invalidate называется onDraw вызывается снова, вы должны также использовать this.getHolder().addCallback(this); и пусть ваш класс реализации Callback и добавьте нереализованные методы

+0

hmm do u означает осуществление обратного вызова к основному виду деятельности? и какой класс я использую getHolder(). addCallBack? извините, если это глупые вопросы, которые я действительно новичок в android – HighMrSai

+0

Он должен быть в классе представления, делая это так, как вам кажется, вы расширяете 'SurfaceHolder', это должен быть тот класс, который вы его реализуете. – FabianCook

+0

@FabianCook OP, вероятно, не использует SurfaceHolder, вместо этого просто расширяет представление и использует его вызов OnDraw. – SMUsamaShah

0

Я думаю, что вам нужно сделать только мнение. Сначала установите контент в качестве вида, в котором вы рисуете на холсте. Вы устанавливаете свой вид подсети только в качестве основного макета. Если вы хотите увидеть «Вид», на котором вы рисуете на холсте. установите этот вид в contentView.

setContentView (canView);

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

Смежные вопросы