4 / 4 / 0
Регистрация: 24.07.2013
Сообщений: 80
1

Снова ImageView

02.08.2013, 11:32. Показов 1804. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Значит, ситуация такая:
создаю IV, ставлю в определённое место, запускаю покадровую анимацию. После анимации требуется нажать на картинку и запустить дальнейшее происходящее. Так вот, на вьюшку, с которой запускаю анимацию, вешала и онклик и онтач, но ничего не работает..не знаю, как решить эту проблему. Может, у кого-то есть идеи?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2013, 11:32
Ответы с готовыми решениями:

Скопировать картинку из одной ImageView в другую ImageView
В ImageView поставлена картинка методом setImageResource. По нажатию на неё, нужно такую-же...

ImageView
Добрый день. Вы не подскажите, как передать изображение из одного ImageView в Другой. Допустим...

ImageView
Добрый день ! Делал проект с нуля, все как обычно, но при поиске id для ImageView мне вдруг выдает...

ImageView
Подскажите как правильно выводить картинку из URL Вроде нашел какой то пример в сети, но что то не...

15
99 / 95 / 9
Регистрация: 09.04.2010
Сообщений: 746
02.08.2013, 20:40 2
Цитата Сообщение от Yushka Посмотреть сообщение
онклик
Если вы о сет_онклик_листенере, то попробуйте в редакторе леяута повесить функцию обработки нажатия, так правильнее. А вопще сорец покажите..
0
4 / 4 / 0
Регистрация: 24.07.2013
Сообщений: 80
05.08.2013, 15:31  [ТС] 3
Java
1
2
3
4
5
6
7
8
//Работа с птицей
         CountPosSize(BirdX, BirdY, BirdW, BirdH);  //тут позиции считаем
         bird=new ImageView(this);
         bird.setImageResource(R.drawable.zero);
         bird.setBackgroundResource(R.anim.anim_bird);
         AnimationDrawable animationBird=(AnimationDrawable)bird.getBackground();
         SetPosSize(bird);  //тут запихиваем по рассчитанным позициям картинку
         animationBird.start();  //ну а тут стартуем анимацию
Вот и надо после того, как сработала анимация (остался последний кадр), повесить нажатие на него. Как - неизвестно (мне).
0
99 / 95 / 9
Регистрация: 09.04.2010
Сообщений: 746
05.08.2013, 17:14 4
Yushka, после 3-й строки вот это надо вставить:
Java
1
2
3
4
5
6
7
8
9
10
11
bird.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP){
 
            // обработка нажатия
            return true;
        }
        return false;
    }
});
0
4 / 4 / 0
Регистрация: 24.07.2013
Сообщений: 80
05.08.2013, 17:20  [ТС] 5
Ну вот я говорила, что вешала и онтач и онклик на bird. Но оно не срабатывает. Есть мысль, что не срабатывает потому, что кадр последний остаётся (он отличен от bird), но на этом список гениальных мыслей и идей заканчивается. И как сделать, чтобы эти методы срабатывали - тоже тайна пока что=(.
0
99 / 95 / 9
Регистрация: 09.04.2010
Сообщений: 746
05.08.2013, 21:06 6
Yushka, вот если бы имага создавалась не динамически, а в десигнере, то в хмл можно было бы повесить клик, который работал бы 100%..
0
Заблокирован
05.08.2013, 21:11 7
а можно кусок кода вместе с
на вьюшку, с которой запускаю анимацию, вешала и онклик и онтач,
?
0
4 / 4 / 0
Регистрация: 24.07.2013
Сообщений: 80
05.08.2013, 21:23  [ТС] 8
Кусок кода выше. Вешала тем же методом, что тут предлагали.
0
Заблокирован
05.08.2013, 21:26 9
я тоже могу написать do {} while и сказать - клянусь, там внутри цикла вычисляло число пи до миллиардного знака
ну да ладно, зря полез
0
4 / 4 / 0
Регистрация: 24.07.2013
Сообщений: 80
06.08.2013, 10:36  [ТС] 10
Не могу так, как Вы предлагаете, потому что расчёт позиций производится по формулам. Иначе не будет всё стоять там, где это нужно. (Все лэйауты не помогут, ставлю относительно фона, учитывая размеры экрана, а не относительно размеров экрана и других элементов)

Добавлено через 2 минуты
verylazy
Я не понимаю, что ещё не хватает Вам=) Тот кусок кода ВЕСЬ. Больше нет ничего, связанного с моим вопросом. bird.setOnClickListener и bird.setOnTouchListener в коде не присутствуют, так как не работают. Вьюшка там есть, анимация там есть. Слушателей и обработчиков нет - не работают они, не срабатывают, пробовала. Что, написать Toast, который был внутри слушателей?)

Добавлено через 13 часов 6 минут
Кстати, странно, но без анимации тоже не работает оО.
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
06.08.2013, 11:25 11
Для того, чтобы узнать когда заканчивается покадровая анимация, есть 2 варианта:
1. Рекурсивная проверка. Надо вызывать этот метод с аргументом animationBird
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void checkIfAnimationDone(AnimationDrawable anim){
        final AnimationDrawable a = anim;
        int timeBetweenChecks = 300;
        Handler h = new Handler();
        h.postDelayed(new Runnable(){
            public void run(){
                if (a.getCurrent() != a.getFrame(a.getNumberOfFrames() - 1)){
                    checkIfAnimationDone(a);
                } else{
                    Toast.makeText(getApplicationContext(), "ANIMATION DONE!", Toast.LENGTH_SHORT).show();
                }
            }
        }, timeBetweenChecks);
    };
2. Так как мы знаем длительность анимации, можно запустить TimerTask. Добавьте этот код после строчки animationBird.start()

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 long totalDuration = 0;  
      for(int i = 0; i< animationBird.getNumberOfFrames();i++){  
       totalDuration += animationBird.getDuration(i);  
      }  
      Timer timer = new Timer();  
  
   TimerTask timerTask = new TimerTask(){  
       @Override  
       public void run() {
                 //Animation stop here
                  animationBird.stop(); 
                           }  
      }};  
   timer.schedule(timerTask, totalDuration);
0
4 / 4 / 0
Регистрация: 24.07.2013
Сообщений: 80
06.08.2013, 11:34  [ТС] 12
Спасибо, я думаю, это пригодится=) Но, к сожалению, не является решением текущей проблемы, так как выяснилось, что и без запуска анимации почему-то не срабатывают ни онклик ни онтач, что меня удивило.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 CountPosSize(BirdX, BirdY, BirdW, BirdH);
         bird=new ImageView(this);
         bird.setImageResource(R.drawable.bset);
         SetPosSize(bird);        
         bird.setOnTouchListener(new View.OnTouchListener() {
             @Override
             public boolean onTouch(View v, MotionEvent event) {
                 switch (event.getAction()) {
 
                     case MotionEvent.ACTION_UP:
                      Toast.makeText(getApplicationContext(), "ololo", Toast.LENGTH_LONG);                    
                     break;
                 }
                 return true;
             }
         });
Методы используемые:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 private void CountPosSize(double pX, double pY, double sX, double sY){
        //расчёт позиций
        double dposX=(w/800)*pX;  //w и h - размеры используемого экрана
        double dposY=(h/480)*pY;
        //расчёт размера
        double dsizeX=w/(800/sX);
        double dsizeY=h/(480/sY);
        //приведение к инту (тк пиксели не могут быть нецелыми)
        posX=(int)dposX;
        posY=(int)dposY;
        sizeX=(int)dsizeX;
        sizeY=(int)dsizeY;
    }
    //метод, помещающий изображение в расчитанные позиции и масштабирующий его
    private void SetPosSize(ImageView iv){
        RelativeLayout mm= (RelativeLayout) findViewById(R.id.first_lay);
        RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(sizeX, sizeY);
        params.leftMargin=posX;
        params.topMargin=posY;
        mm.addView(iv, params);
    }
Может, из-за нового лэйаута не срабатывает?...
0
Заблокирован
06.08.2013, 12:11 13
я бы на входе в метод onTouch, до switch вставил бы System.out.println("пыщ-пыщ");
для начала
0
4 / 4 / 0
Регистрация: 24.07.2013
Сообщений: 80
06.08.2013, 13:14  [ТС] 14
К счастью, необходимость в решении отпала, но я поковыряюсь как-нибудь сама и обязательно ещё вернусь к этому вопросу. А пока всем спасибо=). Но, всё-таки интересно, что делать в случае, если on Touch не срабатыват вообще (если, например, "дебаг", предложенный verylazy, это покажет).
0
99 / 95 / 9
Регистрация: 09.04.2010
Сообщений: 746
06.08.2013, 14:21 15
Цитата Сообщение от Yushka Посмотреть сообщение
Может, из-за нового лэйаута не срабатывает?...
- если переключаться между леяутами, то онтач/клик ОТВАЛИТСЯ. Только если через хмл прописан, то будет работать..
0
4 / 4 / 0
Регистрация: 24.07.2013
Сообщений: 80
06.08.2013, 15:07  [ТС] 16
Цитата Сообщение от MegaSinner Посмотреть сообщение
- если переключаться между леяутами, то онтач/клик ОТВАЛИТСЯ. Только если через хмл прописан, то будет работать..
Спасибо, буду иметь в виду.
0
06.08.2013, 15:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2013, 15:07
Помогаю со студенческими работами здесь

ImageView вращение
Как повернуть программно ImageView на 0-360 градусов понятно , а вот как повернуть его еще и в...

Квадратный ImageView
Как заставить ImageView всегда быть квадратным и при этом максимального размера (расширяться до...

Координаты ImageView
Всем привет, хочу попросить у вас помощи, проблема заключается в следующем: У нас есть приложение...

Таблица из ImageView
Как сделать 9 картинок 3х3, чтобы между ними не было отступов. Точнее я знаю как, вопрос в другом....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru