используя обработчик в Android для создания серии PNG - PullRequest
0 голосов
/ 28 июня 2011

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

public class Panel extends SurfaceView implements SurfaceHolder.Callback {
  private Handler mHandler = new Handler();
  //stuff

  public void doDraw(Canvas canvas) {
        int counter = 0;
        canvas.drawColor(Color.BLACK);
        dot1.doDraw(getResources(), canvas, counter);
            mHandler.removeCallbacks(panelDraw);
                mHandler.postDelayed(panelDraw, 5000);
}

private Runnable panelDraw = new Runnable() {
       public void run() {

       }
};

(Panel ->) mPanel.doDraw (canvas) в другом классе вызывает doDraw, указанный в Panel.Это в цикле.

Насколько я могу судить, первое изображение не останавливается в течение пяти секунд, и из-за другого кода картинка кота мигает по всему экрану.Могу ли я сойти с рук, не ставя ничего в run ()?Я хотел поместить туда dot1.doDraw (getResources (), canvas, counter), но я не мог / не думал, что смогу дать void параметры run () или ресурсы Runnable panelDraw, canvas, параметры счетчика.

Любая помощь приветствуется.Дайте мне знать, если мне нужно дать больше кода.


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

Я слышал, что если вам нужно много рисовать, вам лучше использовать SurfaceView, как в учебном пособии, которому я очень внимательно следил: http://www.droidnova.com/2d-tutorial-series-part-v,848.html Мой класс Activity (Scene1) имеет setContentView (новая панель (это)), поэтому я не знаю, как поместить материал в класс Activity, когда все идет в классе Panel.Например, куда я могу поместить код ImageView, если поток Activity на самом деле мало что делает и передает все это Panel?Также, если у меня есть ViewThread (открытый класс ViewThread расширяет Thread), который обрабатывает выполнение:

public void run() {
    Canvas canvas = null;
    while (mRun1) {
     do {
        canvas = mHolder.lockCanvas();
            if (canvas != null) {
               mPanel.doDraw(canvas);
               mRun1 = true;
               mRun1 = mPanel.get_run();
               mHolder.unlockCanvasAndPost(canvas);
            }
    } while (mRun1 == true);

Точечный класс имеет что-то вроде:

public void firstRing(Resources res, Canvas canvas, int counter){
    Random rand = new Random();
        switch(counter) {
            case 0:  mBitmap = BitmapFactory.decodeResource(res,     
                         R.drawable.cat1_m);
                break;
            case 1:  mBitmap = BitmapFactory.decodeResource(res, 
                         R.drawable.cat2_m);
                break;
            case 2:  mBitmap = BitmapFactory.decodeResource(res,                   
                         R.drawable.cat2_m);
                break;
            case 3:  mBitmap = BitmapFactory.decodeResource(res,   
                         R.drawable.cat2_m);
                break;
            case 4:  mBitmap = BitmapFactory.decodeResource(res,                          
                         R.drawable.cat2_m);
                            break;
            case 5:  mBitmap = BitmapFactory.decodeResource(res, 
                         R.drawable.cat1_m);
                break;
        }
        mX = rand.nextInt((int)(Panel.mWidth - mBitmap.getWidth()));
        mY = rand.nextInt((int)(Panel.mHeight - mBitmap.getHeight()));
    canvas.drawBitmap(mBitmap, mX, mY, null);

и

 public void doDraw(Resources res, Canvas canvas, int counter) {
      firstRing(res, canvas, counter);
}

Спасибо за информацию, Барри, хотя я немного растерялся.Я пытаюсь использовать ImageView или придерживаюсь Handler (), хотя я не знаю, как его использовать, и он сейчас не работает?Нужно ли что-нибудь публично void run ()?

1 Ответ

0 голосов
/ 28 июня 2011

Этот код должен работать лучше, чем мой последний ответ, но я не скомпилировал и не протестировал его.Даже если это не сработает, это укажет вам правильное направление.Я предполагаю, что у вас есть подкласс Activity, поэтому просто скопируйте мой код в свою деятельность.Ваш макет должен иметь где-то тег <ImageView>.

Приведенный ниже код создает обработчик в Activity.onCreate(), который выполняется в потоке пользовательского интерфейса, гарантируя, что все вызовы обработчика также будут выполняться вПользовательский интерфейсЗатем он вызывает showNextKittyImage() для отображения первого изображения.showNextKittyImage() устанавливает идентификатор ресурса Drawable для ImageView, а затем вызывает Handler.sendEmptyMessageDelayed() для вызова обработчика через 5 секунд.Обработчик вызывает showNextKittyImage() и цикл повторяется.

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

Этот код также не заставит котят появляться в случайных местах.Сначала запустите его в одном месте, затем добавьте код для случайного перемещения ImageView по экрану.Если вам нужна помощь, я настоятельно рекомендую опубликовать новый вопрос, поскольку вы задали много для одной публикации.

Удачи,

Барри

public class KittyActivity extends Activity {

    Handler mHandler;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Inflate your view
        setContentView(R.layout.YOUR_LAYOUT);

        // Create a handler ON THE UI THREAD
        mHandler = new Handler(Message result) {
            public void handleMessage(Message result) {
                showNextKittyImage();
            }
        };

        // Show the first kitty
        showNextKittyImage();
    }

    public void showNextKittyImage() {
        int kitty = getNextKitty();
        ImageView iv = findViewById(R.id.YOUR_IMAGE_VIEW_ID);
        iv.setImageResource(kitty);

        // OPTIONAL: Move the ImageView to a new random location

        mHandler.sendEmptyMessageDelayed(0, 5000);
    }


    private int getNextKitty() {
        // Your code to get the next kitty drawable id
    }
}
...