Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Yushka
4 / 4 / 1
Регистрация: 24.07.2013
Сообщений: 80
#1

Снова ImageView - Программирование Android

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

Значит, ситуация такая:
создаю IV, ставлю в определённое место, запускаю покадровую анимацию. После анимации требуется нажать на картинку и запустить дальнейшее происходящее. Так вот, на вьюшку, с которой запускаю анимацию, вешала и онклик и онтач, но ничего не работает..не знаю, как решить эту проблему. Может, у кого-то есть идеи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2013, 11:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Снова ImageView (Программирование Android):

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

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

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

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

Баг с imageView
Никто случайно не сталкивался с такой проблемой: использую TabHost(7 вкладок),...

Координаты imageView
Доброго времени суток. Как программно установить координаты появления...

15
MegaSinner
96 / 92 / 9
Регистрация: 09.04.2010
Сообщений: 746
02.08.2013, 20:40 #2
Цитата Сообщение от Yushka Посмотреть сообщение
онклик
Если вы о сет_онклик_листенере, то попробуйте в редакторе леяута повесить функцию обработки нажатия, так правильнее. А вопще сорец покажите..
0
Yushka
4 / 4 / 1
Регистрация: 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
MegaSinner
96 / 92 / 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
Yushka
4 / 4 / 1
Регистрация: 24.07.2013
Сообщений: 80
05.08.2013, 17:20  [ТС] #5
Ну вот я говорила, что вешала и онтач и онклик на bird. Но оно не срабатывает. Есть мысль, что не срабатывает потому, что кадр последний остаётся (он отличен от bird), но на этом список гениальных мыслей и идей заканчивается. И как сделать, чтобы эти методы срабатывали - тоже тайна пока что=(.
0
MegaSinner
96 / 92 / 9
Регистрация: 09.04.2010
Сообщений: 746
05.08.2013, 21:06 #6
Yushka, вот если бы имага создавалась не динамически, а в десигнере, то в хмл можно было бы повесить клик, который работал бы 100%..
0
verylazy
Заблокирован
05.08.2013, 21:11 #7
а можно кусок кода вместе с
на вьюшку, с которой запускаю анимацию, вешала и онклик и онтач,
?
0
Yushka
4 / 4 / 1
Регистрация: 24.07.2013
Сообщений: 80
05.08.2013, 21:23  [ТС] #8
Кусок кода выше. Вешала тем же методом, что тут предлагали.
0
verylazy
Заблокирован
05.08.2013, 21:26 #9
я тоже могу написать do {} while и сказать - клянусь, там внутри цикла вычисляло число пи до миллиардного знака
ну да ладно, зря полез
0
Yushka
4 / 4 / 1
Регистрация: 24.07.2013
Сообщений: 80
06.08.2013, 10:36  [ТС] #10
Не могу так, как Вы предлагаете, потому что расчёт позиций производится по формулам. Иначе не будет всё стоять там, где это нужно. (Все лэйауты не помогут, ставлю относительно фона, учитывая размеры экрана, а не относительно размеров экрана и других элементов)

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

Добавлено через 13 часов 6 минут
Кстати, странно, но без анимации тоже не работает оО.
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 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
Yushka
4 / 4 / 1
Регистрация: 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
verylazy
Заблокирован
06.08.2013, 12:11 #13
я бы на входе в метод onTouch, до switch вставил бы System.out.println("пыщ-пыщ");
для начала
0
Yushka
4 / 4 / 1
Регистрация: 24.07.2013
Сообщений: 80
06.08.2013, 13:14  [ТС] #14
К счастью, необходимость в решении отпала, но я поковыряюсь как-нибудь сама и обязательно ещё вернусь к этому вопросу. А пока всем спасибо=). Но, всё-таки интересно, что делать в случае, если on Touch не срабатыват вообще (если, например, "дебаг", предложенный verylazy, это покажет).
0
MegaSinner
96 / 92 / 9
Регистрация: 09.04.2010
Сообщений: 746
06.08.2013, 14:21 #15
Цитата Сообщение от Yushka Посмотреть сообщение
Может, из-за нового лэйаута не срабатывает?...
- если переключаться между леяутами, то онтач/клик ОТВАЛИТСЯ. Только если через хмл прописан, то будет работать..
0
Yushka
4 / 4 / 1
Регистрация: 24.07.2013
Сообщений: 80
06.08.2013, 15:07  [ТС] #16
Цитата Сообщение от MegaSinner Посмотреть сообщение
- если переключаться между леяутами, то онтач/клик ОТВАЛИТСЯ. Только если через хмл прописан, то будет работать..
Спасибо, буду иметь в виду.
0
06.08.2013, 15:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2013, 15:07
Привет! Вот еще темы с решениями:

Сохранение ImageView
Всем привет, У меня такой вопрос, есть код который сохраняет imageview в...

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

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

Сохранить ImageView
Подскажите пожалуйста, пытаюсь наложить bitmap на bitmap из imageview и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru