Android: измените пример APIDemo AnimateDrawable.java, чтобы иметь ClickEvent-Handler - PullRequest
1 голос
/ 05 ноября 2010

Мне нравятся демонстрационные примеры API с веб-страницы Android, и я использовал AnimateDrawable.java для Начните с WaterfallView с несколькими прямыми падающими изображениями, которые прекрасно работают. Теперь мне нравится останавливать изображения, когда на них нажимают. Я обнаружил, что Drawables не может обрабатывать события, поэтому я изменил AnimateDrawable и ProxyDrawable для расширения из View вместо этого и добавил Click-Event-Listener и обработчик в родительском WaterfallView. Анимация по-прежнему работает отлично, но обработчик - нет, возможно, потому, что в AnimateDrawable весь холст смещается, когда анимируемые объекты. Как я могу изменить этот пример, чтобы я мог реализовать обработчик событий? Или есть способ узнать, где именно находятся мои AnimateDrawables?

Итак, более общий вопрос: Как добавить прослушиватель / обработчик событий в анимированный просмотр?

Вот мои изменения в приведенном выше примере:

  • AnimateView и ProxyView вместо AnimateDrawable и ProxyDrawable
  • ProxyView расширен от View, и все супер вызовы изменены на mProxy
  • Я прокомментировал mutate ()
  • Контекст по-прежнему является основным действием, которое передается в конструкторах
  • В конструкторах AnimateView называются setClickable (true) и setFocusable (true)

А вот важный исходный код родительского / основного WaterfallView:

  public class WaterfallView extends View implements OnClickListener {

  private Context mContext;
  // PictureEntry is just a value object to manage the pictures
  private Vector<PictureEntry> pictures = new Vector<PictureEntry>();

  public WaterfallView(Context context) {
  super(context);
  mContext = context;

  pictures.add(new PictureEntry(context.getResources().getDrawable(R.drawable.sample_0)));
  pictures.add(new PictureEntry(context.getResources().getDrawable(R.drawable.sample_1)));
  pictures.add(new PictureEntry(context.getResources().getDrawable(R.drawable.sample_2)));
  pictures.add(new PictureEntry(context.getResources().getDrawable(R.drawable.sample_3)));
  pictures.add(new PictureEntry(context.getResources().getDrawable(R.drawable.sample_4)));
  pictures.add(new PictureEntry(context.getResources().getDrawable(R.drawable.sample_5)));
  pictures.add(new PictureEntry(context.getResources().getDrawable(R.drawable.sample_6)));
  pictures.add(new PictureEntry(context.getResources().getDrawable(R.drawable.sample_7)));
  }

  @Override
  protected void onDraw(Canvas canvas) {
  if(!setup) {
  for(PictureEntry pic : pictures) pic.setAnimation(createAnimation(pic));
  setup = true;
  }

  canvas.drawColor(Color.BLACK);
  for(PictureEntry pic : pictures) pic.getAnimateView().draw(canvas);
  invalidate();
  }

  private Animation createAnimation(PictureEntry picture) {
  Drawable dr = picture.getDrawable();
  dr.setBounds(0, 0, dr.getIntrinsicWidth(), dr.getIntrinsicHeight());
  Animation an = new TranslateAnimation(0, 0, -1*dr.getIntrinsicHeight(), this.getHeight());
  an.setRepeatCount(-1);
  an.initialize(10, 10, 10, 10);
  AnimateView av = new AnimateView(mContext, dr, an);
  av.setOnClickListener(this);
  picture.setAnimateView(av);
  an.startNow();
  return an;
  }

  @Override
  public void onClick(View v) {
  Log.i("MyLog", "clicked "+v);
  }
  }

1 Ответ

0 голосов
/ 05 ноября 2010

Вы собираетесь нажимать на виджеты (кнопки, флажки и т. Д.)? Или вы хотите иметь возможность щелкать в любом месте? Я думаю, что вы хотите последнее. Так что в этом случае вам понадобится этот метод:

@Override</p> <pre>public boolean onTouchEvent(MotionEvent event) { // do stuff with your event }

Этот метод ONLY вызывается, когда событие NOT обрабатывается представлением, поэтому я думаю, что вам, возможно, придется удалить некоторые из ваших элементов onClickListener. Обратитесь к здесь для получения дополнительной информации. И как всегда, эксперимент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...