Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
KypcPerm
5 / 5 / 0
Регистрация: 23.03.2013
Сообщений: 38
#1

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

23.03.2013, 14:16. Просмотров 905. Ответов 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).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2013, 14:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Несколько экземпляров класса (Программирование Android):

Создание массива экземпляров разных классов - Программирование Android
Здравствуйте! Возникла необходимость создать массив с экземплярами разных классов, так как ~60 строчек похожих по содержанию корректировать...

Класс: Хочу из класса WorkFiles получить доступ к функционалу класса WorkDB. - Программирование Android
Есть 3 класса: MainActivity, WorkDB и WorkFiles. Хочу из класса WorkFiles получить доступ к функционалу класса WorkDB. Файл...

Как изменить Textview из другого класса (класса адаптера RecyclerView) - Программирование Android
У меня есть список RecyclerView тоесть этот файл Basket и файл что реализует cardwiew BasketAdapter. как мне изменить TextView allPrice из...

Сделать несколько экземпляров класса со статическими полями - C#
Здравствуйте, для начала обрисую проблему. Есть обычный класс Человек с присущими человеку параметрами: возраст, вес имя и т.д. В этом...

Как хранить несколько экземпляров класса с их свойствами? - C#
Есть у нас класс - овощи объект - овощ: картошка, огурец, морковь у них есть свойства - цвет, вес, ширина, высота, они хранятся тоже в...

Динамический массив экземпляров класса, с неизвестным количеством экземпляров - C++ Builder
Доброго времени суток. По ходу работы, программно должны создаваться и удаляться объекты класса. Во всех примерах с дин массивами...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.03.2013, 13:44 #2
видимо второй перекрывает первый.
KypcPerm
5 / 5 / 0
Регистрация: 23.03.2013
Сообщений: 38
25.03.2013, 16:18  [ТС] #3
А как разделить экран что бы не перекрывало?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.03.2013, 16:26 #4
их размер не должен быть на весь экран и они должны быть размещены в разных частях екрана
вот пример
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="text1" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="text2" />
 
</RelativeLayout>
и научитесь пользоваться XML разметкой, с вашего кода непонятно где эти джойстики размещены и какой у них размер.
KypcPerm
5 / 5 / 0
Регистрация: 23.03.2013
Сообщений: 38
29.03.2013, 09:36  [ТС] #5
и научитесь пользоваться XML разметкой, с вашего кода непонятно где эти джойстики размещены и какой у них размер.
У меня свой View класс, к сожалению я не знаю как сделать свой класс, что бы я мог указывать его место положение через view класс, поэтому месторасположение элемента я указываю в конструкторе своего класса.
А по теме вопрос решен, изменением логикой приложений. За координатами следит layout, который передает их в каждый экземпляр класса, на основе этих координат класс принимает решение о дальнейших действиях.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
29.03.2013, 12:20 #6
Цитата Сообщение от KypcPerm Посмотреть сообщение
У меня свой View класс
XML
1
2
3
4
 <com.my.package.MyView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true" />
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 12:20
Привет! Вот еще темы с ответами:

Несколько экземпляров приложения - C++ WinAPI
Окно первого экземпляра приложения расположить в левом верхнем, второго - в правом верхнем, третьего - в левом нижнем, четвертого - в...

несколько экземпляров приложения запускается - Windows 8, 8.1
при загрузку windows 8.1 в процессах загружается несколько экземпляров приложении от asus. как можно сделать что бы было тока по одному...

Установить несколько экземпляров ноды - RedHat, Fedora Linux
Подскажите пожалуйста как для каждого пользователя установить свой экземпляр ноды (node.js)? Тоесть есть к примеру: /home/user1/...

Реализовать несколько экземпляров типа - Turbo Pascal
1.Базовый тип объект &quot;режим вывода&quot; содержит: - Поля: координаты на экране, цвет фона, цвет изображения -методы: инициализации с...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.03.2013, 12:20
Ответ Создать тему
Опции темы

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