2011-02-04 3 views
3

Я новичок в Android и у меня возникают проблемы понимания концепции так в основном это то, что я хочу сделать, чтобы лучше понять его ..Android OnDraw()

  • Я создал класс DrawShape, который расширяет представление , В этом классе в OnDraw() я создаю круг и заполняю его цветом.

  • От деятельности Я звоню в приложение. // До этого момента у меня все в порядке.

Теперь мне нужно перекрасить Круг несколько раз (синий, красный, желтый и т.д ..)

Так что я читал и лучший способ заключается в использовании темы .. Я также прочитал вам нужно использовать postInvalidate() для перерисовки (я все еще не понимаю, откуда я должен это назвать) называется ли это вызовом из Activity? или внутри OnDraw() ?.

Надеюсь, вы понимаете, чего я хочу достичь, это только то, что я havent нашел хороший учебник, который показывает это, как перекрасить что-то х раз. Когда я делаю Thread.sleep(), он останавливается, а затем показывает мое приложение .. но теперь я понимаю, почему, потому что я играю с главной нитью.

Пожалуйста, помогите мне понять это ..

Спасибо

ответ

0

я думаю, вы можете сделать это с помощью таймера и TimerTask внутри вашей деятельности. TimerTask работает с указанной вами задержкой, и когда вы запускаете все, что вам нужно сделать, это yourDrawShapeInstance.postInvalidate();

Механизм это, потому что вы arent на нити ui вы вызываете postInvalidate(), чтобы добавить invalidate в очередь ui, когда двигатель ui выбирает задержанную недействительную, которую вы вызываете раньше, затем автоматически вызывает метод onDraw ваш вид DrawShape и вид будут перерисовываться.

(Я не проверить это, я пишу здесь)

TimerTask task = new TimerTask(){ 
    public void run(){ 
    myDrawShapeInstance.postInvalidate(); 
    } 
} 
0

При рисовании, всегда использовать нить от основного потока и всегда недействительным после того, как нить завершения (по большей части - в отображать текущие результаты рисования). Вероятно, вы вызовете свои функции рисования из некоторого связанного с пользователем события, поэтому убедитесь, что вы делаете другой поток для этого процесса рисования. Следуйте этим правилам, и с вами все будет в порядке.

void drawCircleToCanvas(int color) 
{ 
final Handler handler = new Handler() { 
      public void handleMessage(Message msg) { 
       myDrawShapeInstance.postInvalidate(); 
       } 
      }; 
     Thread updateUI = new Thread() { 
      public void run() { 

      //************draw something here*************** 

       handler.sendEmptyMessage(0); 
       } 
      }; 
      updateUI.start(); 
} 
+0

Отлично, если мне нужно перерисовать круг, то в перспективе() я могу поставить что-то вроде Canvas с = новый Canvas(); и Paint paint = new Paint(); Могу ли я сделать это здесь? что ты предлагаешь? Кроме того, что если у меня есть класс, который расширяет представление, могу ли я сделать что-то вроде myClass.OnDraw(); ? – earm

+0

Пара вещей здесь: поток должен использоваться для обновления значений, влияющих на холст. Например, перемещение позиции символа в игре ++ x (перемещение символа по горизонтали над позицией). Вы можете использовать поток для изменения значения количества кругов для рисования и цветов для их изменения. Вызывая функцию postInvalidate(), функция canvas onDraw() также будет вызвана, поэтому вам не нужно напрямую обращаться к onDraw(). Эта ссылка имеет код, очень похожий на то, что вы делаете: http://blog.goltergaul.de/2010/03/android-game-project-basics-of-threads-and-canvas/ – ice911

3

я сделал что-то вроде этого

animcolor() 
{ 
Timer timer = new Timer(); 
int delay = ...; 
int period = ...; 
timer.schedule(new TimerTask(){ 
    run() { 
     setColor(randomint());) 
     customview.postInvalidate(); 
    } 
}, delay, period); 

нити? не нужно создавать их; Таймеры делают хорошую работу по параллелизму.

... и код будет несколько похож ....

res/layout/file.xml

<org.customviewlayout a:id="@+id/customlayout"/> 



src/org.MyActivity.java 


class MyActivity 
{ 
    onCreate() 
    { 
    customlayout = findViewById(R.id.customlayout); 
    customlayout.animcolor(); 
    } 
} 

src/org.customlayout.java

import org.customview; 
class customlayout 
{ 
    customview; 

    customlayout(context, attrs) 
    { 
    customview = new customview(); 
    addview(customview); // so it's onDraw() method will be called 
    } 

    onlayout(...) 
    { 
    customview.layout(...); 
    } 

    animcolor() 
    { 
    Timer timer = new Timer(); 
    int delay = ...; 
    int period = ...; 
    timer.schedule(new TimerTask(){ 
     run() { 
      setColor(randomint());) 
      customview.postInvalidate(); 
     } 
    }, delay, period); 

    } 

    setcolor(int) 
    { 
    .... 
    } 
}