Мне нравятся демонстрационные примеры 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);
}
}