Форум программистов, компьютерный форум, киберфорум
Наши страницы

Несколько экземпляров класса - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Работа с кнопками http://www.cyberforum.ru/android-dev/thread816165.html
Есть 4 ImageButton при нажатии на которых должно происходить одно действие, а при отжатии - другое. Это работает. Но если провести пальцем по всем 4-ём кнопкам - ничего не происходит. Нужно сделать,...
Программирование Android Как удалить системные категории в меню андроид? здравствуйте! купил телефон андроид 234 в нем были брендовые системные приложения находившиеся в в меню в отдельной категории, я удалил эти ненужные приложения, а пустая категория осталась.... http://www.cyberforum.ru/android-dev/thread816079.html
Программирование Android Receiver не принимает сообщения
Привет. Почему-то receiver не принимает системные броадкасты, можешь какая-то ошибка в моей писанине, а ее "замыленым" взглядом не вижу. Код: public class ApplicationStartListener extends...
Обработчик кнопки Программирование Android
С помощью нажатия хочу перелистывать интерфейс приложения. XML заранее уже сделаны в layout - без ошибок. Если одну кнопку обрабатываю - все хорошо(ниже приведен код с одной кнопкой)...Если две -...
Программирование Android Почему .setBackground не работает? http://www.cyberforum.ru/android-dev/thread815919.html
У меня кнопки представляют собой TextView'ы, на которых по умолчанию выставлены соотв. рисунки, но при попытке изменить их(на любые) при нажатии, путем:...
Программирование Android Exception при нажатии любых кнопок Я выставил листенер самим правильным образом - через xml, но при нажатии вылетает ошибка: 02-14 21:55:09.355: ERROR/AndroidRuntime(974): FATAL EXCEPTION: main ... подробнее

Показать сообщение отдельно
KypcPerm
5 / 5 / 0
Регистрация: 23.03.2013
Сообщений: 42

Несколько экземпляров класса - Программирование Android

23.03.2013, 14:16. Просмотров 932. Ответов 5
Метки (Все метки)

Написал свой View класс, представляет из себя, некоторое подобие джойстика используемого в играх на андроиде:
Большой круг, внутри его маленький шарик, который движется в пределах круга, за касанием пальца. Вот код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.example.diplom;
 
 
import java.util.concurrent.TimeUnit;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
 
 
 
 
 public class SomeView extends View implements OnTouchListener
 {
      public Paint paint,paintVn; //внешний вид джойстика
      private int   X,Y,CenterY,CenterX; //центр окружностей джостика
      private int CointPointer;
      
      boolean touch;// флаг касание
      
      
      final static int Radius=20,
                       VnRad=80;
      
      public int GetX(){
          return X;
      }
      public int GetY(){
          return Y;
      }
      
      
      public SomeView(Context context, int x, int y)
      {
          super(context);          
          Log.w("exp", "Заработал конструктор класса");
          
          // настраиваем внешний вид джойстика
          this.paintVn=new Paint();         
          this.paintVn.setColor(Color.BLUE);
          this.paintVn.setStyle(Style.STROKE);
          this.paint = new Paint();
          this.paint.setColor(Color.GREEN);
          this.paint.setStyle(Style.FILL_AND_STROKE);
          
          //устанавливаем координаты джойстика
          X=x;        
          Y=y;
          CenterX=x;
          CenterY=y;
          
          Log.i("exp", "Конструктор класса отработал!");
      }
      
         
      @Override
      public boolean onTouchEvent (MotionEvent event)
      {
          int[] x1=new int[2];
          int[] y1= new int [2]; // точки касания
          int i;
          CointPointer=event.getPointerCount();
        for (i = 0; i < CointPointer; i++) {
            x1[i] = (int) event.getX(i);
            y1[i] = (int) event.getY(i);
            Log.d("exp", "пойманно касание x=" + x1[i] + " y=" + y1[i]+" CX="+CenterX+" CY="+CenterY);
            // обрабатываем нажатие
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:// нажатие на экран
                touch = true;
                break;
            case MotionEvent.ACTION_MOVE:
                // проверяем не выходит ли круг джостика за пределы джостика
                if ((x1[i] - CenterX) * (x1[i] - CenterX) + (y1[i] - CenterY)
                        * (y1[i] - CenterY) <= VnRad * VnRad) {
                    X = x1[i];// если не выходит то перемещаем круг
                    Y = y1[i];
                }
                break;
            case MotionEvent.ACTION_UP: // реализуем возвращение шарика, при
                                        // отпускании
                Thread t = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while ((X != CenterX) || (Y != CenterY)) {
                            if (X > CenterX)
                                X--;
                            if (X < CenterX)
                                X++;
                            if (Y > CenterY)
                                Y--;
                            if (Y < CenterY)
                                Y++;
                            try {
                                TimeUnit.MILLISECONDS.sleep(5);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            Log.w("cicl", "Выхожу в цикл Х=" + X + " СХ="
                                    + CenterX + " Y=" + Y + " CY=" + CenterY);
                        }
                    }
                });
                t.start();
            }
        }
          return true;
      }
            
      @Override
      protected void onDraw(Canvas canvas)
      {
          // рисуем джойстик
          canvas.drawCircle(X, Y, Radius, paint);
          canvas.drawCircle(CenterX, CenterY, VnRad, paintVn);    
          invalidate();
      }
 
 
}
 
  }
В основном классе создается 2 объекта этого класса (левый и правый) которые должны двигаться одновременно (устройство должно поддерживать мультитач):

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// узнаем разрешение экрана
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        hght=metrics.heightPixels;
        wght=metrics.widthPixels;
        Log.d("exp", "Разрешение экрана h="+hght+" !w="+wght);
        
        Log.d("exp", "объявляем классы");
        
        RelativeLayout rl= (RelativeLayout) findViewById(R.id.relative);
        SomeView lJ= new SomeView(this,wght-150,hght-250);
        SomeView  rJ=new SomeView(this,150,hght-250);
        rl.addView(rJ);
        rl.addView(lJ);
Дело в том что 2 экземпляр перехватывает любое нажатие, в свое время первый его даже не обрабатывает. В следствии чего меня интересует, кто нибудь знает как отловить нажатие в конкретной области экрана(в моем случае в окружности нарисованной на Canvas).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru