Exemplo n.º 1
0
  private void prepare(final Runnable runnable) {
    if (drawTask == null) {
      drawTask =
          createTask(
              mDanmakuView.isDanmakuDrawingCacheEnabled(),
              timer,
              mDanmakuView.getContext(),
              mDanmakuView.getWidth(),
              mDanmakuView.getHeight(),
              new IDrawTask.TaskListener() {
                @Override
                public void ready() {
                  runnable.run();
                }
              });

    } else {
      runnable.run();
    }
  }
Exemplo n.º 2
0
  @Override
  public void handleMessage(Message msg) {
    int what = msg.what;
    switch (what) {
      case PREPARE:
        if (mParser == null || !mDanmakuView.isViewReady()) {
          sendEmptyMessageDelayed(PREPARE, 100);
        } else {
          prepare(
              new Runnable() {
                @Override
                public void run() {
                  mReady = true;
                  if (mCallback != null) {
                    mCallback.prepared();
                  }
                }
              });
        }
        break;
      case START:
        Long startTime = (Long) msg.obj;
        if (startTime != null) {
          pausedPostion = startTime.longValue();
        } else {
          pausedPostion = 0;
        }
      case RESUME:
        quitFlag = false;
        if (mReady) {
          mTimeBase = System.currentTimeMillis() - pausedPostion;
          timer.update(pausedPostion);
          removeMessages(RESUME);
          sendEmptyMessage(UPDATE);
          drawTask.start();
        } else {
          sendEmptyMessageDelayed(RESUME, 100);
        }
        break;
      case SEEK_POS:
        Long deltaMs = (Long) msg.obj;
        mTimeBase -= deltaMs;
        timer.update(System.currentTimeMillis() - mTimeBase);
        if (drawTask != null) drawTask.seek(timer.currMillisecond);
        pausedPostion = timer.currMillisecond;
        removeMessages(RESUME);
        sendEmptyMessage(RESUME);
        break;
      case UPDATE:
        if (quitFlag) {
          break;
        }
        long startMS = System.currentTimeMillis();
        long d = timer.update(startMS - mTimeBase);
        if (mCallback != null) {
          mCallback.updateTimer(timer);
        }
        if (d < 0) {
          removeMessages(UPDATE);
          sendEmptyMessageDelayed(UPDATE, 60 - d);
          break;
        }
        d = mDanmakuView.drawDanmakus();
        removeMessages(UPDATE);
        if (d == -1) {
          // reduce refresh rate
          sendEmptyMessageDelayed(UPDATE, 100);
          break;
        }

        if (d <= 16) {
          sendEmptyMessage(UPDATE);
          SystemClock.sleep(16 - d);
          break;
        }
        sendEmptyMessage(UPDATE);
        break;
      case SHOW_DANMAKUS:
        Long start = (Long) msg.obj;
        if (start == null && drawTask != null) {
          drawTask.requestClear();
        } else if (start != null && drawTask != null) {
          drawTask.start();
          drawTask.seek(start);
          drawTask.requestClear();
          obtainMessage(START, start).sendToTarget();
        }
        mDanmakusVisible = true;
        break;
      case HIDE_DANMAKUS:
        if (mDanmakuView != null) {
          mDanmakuView.clear();
        }
        Boolean quitDrawTask = (Boolean) msg.obj;
        if (quitDrawTask.booleanValue() && this.drawTask != null) {
          this.drawTask.quit();
        }
        mDanmakusVisible = false;
        if (!quitDrawTask) {
          break;
        }
      case PAUSE:
      case QUIT:
        removeCallbacksAndMessages(null);
        quitFlag = true;
        mDrawTimes.clear();
        pausedPostion = timer.currMillisecond;
        if (what == QUIT) {
          if (this.drawTask != null) {
            this.drawTask.quit();
          }
          if (this.getLooper() != Looper.getMainLooper()) this.getLooper().quit();

          if (mParser != null) {
            mParser.release();
          }
        }
        break;
    }
  }