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

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

Войти
Регистрация
Восстановить пароль
 
 
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
#1

Как нарисовать точку в месте долгого нажатия? - Программирование Android

13.05.2014, 09:05. Просмотров 1002. Ответов 16
Метки нет (Все метки)

уважаемые разработчики, прошу вас помочь решить следующую проблему:

есть масштабируемая картинка (карта этажа здания), как прописать событие долгого нажатия(LongTouch), и в нем по координатам нажатия поставить точку, обычную точку, метку??

есть ли решения не через Canvas?

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
private void handleLongPress(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
 
            new Thread(new Runnable() {
                public void run() {
                    Looper.prepare();
                    if (isLongPressDetected()) {
                        //ЗДЕСЬ нужно прописать рисование точки..
                    }
                }
            }).start();
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            if (event.getHistorySize() < 1)
                return;
 
            float diffX = event.getX()
                    - event.getHistoricalX(event.getHistorySize() - 1);
            float diffY = event.getY()
                    - event.getHistoricalY(event.getHistorySize() - 1);
 
            if (Math.abs(diffX) > 0.5f || Math.abs(diffY) > 0.5f) {
                isPotentialLongPress = false;
            }
        } else {
            isPotentialLongPress = false;
        }
    }
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2014, 09:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как нарисовать точку в месте долгого нажатия? (Программирование Android):

Отображение картинки в месте нажатия на экран - Программирование Android
Подскажите пожалуйста как сделать что бы в месте нажатия на экран появлялась картинка. Заранее спасибо.

OnTouchEvent - нарисовать точку - Программирование Android
Здравствуйте! Уже который час мучаюсь с программой. В том месте где пользователь прикасается к экрану нужно нарисовать точку (Circle)....

Удаление сообщения (SMS) путем долгого тапа - Программирование Android
Задача: Реализовать метод, удаляющий сообщение(SMS) долгим тапом. Дано: Сообщения выводятся в listview. Метод, отлавливающий...

Как нарисовать точку - C#
Какой способ/метод нужно использовать чтобы построить точку на графике координат. Т.е. для построения линии, прямоугольника или элипса...

Как нарисовать точку на треугольнике? - C# WPF
Как нарисовать точку на треугольнике в WPF из C# кода?

Как в Qt нарисовать точку в консоле? - C++ Qt
Можно ли в консоле в Qt поставить пиксель. Если не Qt то можно: #include &lt;windows.h&gt; SetPixel(hDc, x,y,RGB(255,0,9)); А в Qt...

16
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.05.2014, 10:32 #2
Tatiana_aha,
1. Чем Вас не устраивает canvas?
2. Зачем Вы порождаете новый поток?

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
public class PointImageView extends ImageView {
 
    private Point point;
 
    public PointImageView(Context context) {
        super(context);
    }
 
    public PointImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    public PointImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
 
    //Вызываем этот метод, передаём туда точку.
    //Если передаём null - точка рисоваться не будет
    public void setPoint(Point point) {
        this.point = point;
    }
 
    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        if (point != null) {
            Paint paint = new Paint();
            paint.setColor(Color.BLACK);
            canvas.drawPoint(point.x, point.y, paint);
        }
    }
}
0
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 10:45  [ТС] #3
YuraAAA, я учусь по мере продвижения своего проекта-диплома..все в первый раз и "все сразу"(простите уж)

т.е. мы можем этот этот код использовать тут
Java
1
2
3
4
5
private void handleLongPress(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
//ТУТ?
 
}
и передать в координаты точки координаты нажатия..?
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.05.2014, 10:57 #4
Tatiana_aha,
Цитата Сообщение от Tatiana_aha Посмотреть сообщение
я учусь по мере продвижения своего проекта-диплома..все в первый раз и "все сразу"(простите уж)
Это отлично, что Вы пытаетесь делать сами.

1. Берём класс, который я скинул и вставляем в приложение.
2. Берём разметку и изменяем Ваш ImageView на тот, который я скинул:

Например, было так:

XML
1
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content"/>
А надо так:

XML
1
<com.example.PointImageView android:layout_width="wrap_content" android:layout_height="wrap_content"/>
3. Меняем тип в коде ImageView на PointImageView.
4. Нажатие:

Java
1
2
3
 if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    your_point_image_view.setPoint(new Point(event.getX(), event.getY()));
                }
Должно работать
0
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 11:05  [ТС] #5
YuraAAA, ух, спасиибо огромное, сейчас попробую:-)
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.05.2014, 11:07 #6
Tatiana_aha, пока что не за что. Я сам не проверял
0
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 11:25  [ТС] #7
говорит,
Java
1
The constructor Point(float, float) is undefined
..

у меня в коде
Java
1
2
 xCoor = event.getX();
       yCoor = event.getY();
, где xCoor и yCoor типа float..
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.05.2014, 11:28 #8
Tatiana_aha, приведите к инту.

Java
1
new Point((int) your_float_X, (int) your_float_Y);
Покажите как свой код.
0
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 12:32  [ТС] #9
прошу прощения, инет не дает работать никак(
вот код:
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
129
package com.tatyana.proba2;
 
import android.app.Activity;
import android.content.Intent;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.PointF;
import android.os.Bundle;
import android.os.Looper;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
 
 
 
public class CreateMesto extends Activity implements OnTouchListener {
    
    float xCoor;
    float yCoor;
    
    private static final String TAG = "Touch";
 
    private static final float MIN_ZOOM = 1.0f;
    private static final float MAX_ZOOM = 5.0f;
 
    
    Matrix matrix = new Matrix();
    Matrix savedMatrix = new Matrix();
 
    
    static final int NONE = 0;
    static final int DRAG = 1;
    static final int ZOOM = 2;
    int mode = NONE;
 
    
    PointF start = new PointF();
    PointF mid = new PointF();
    float oldDist = 1f;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.createmesto);
       
       PointImageView view = (PointImageView) findViewById(R.id.PointimageView);
       
       Intent intent1 = getIntent();
       String st_print=intent1.getStringExtra("st_print");
       int drawableResourceId = getResources().getIdentifier(st_print, "drawable", getPackageName());
       view.setImageResource(drawableResourceId); 
       view.setScaleType(PointImageView.ScaleType.FIT_CENTER);
       view.setOnTouchListener(this);   
    }
 
    public boolean onTouch(View v, MotionEvent event) {
       PointImageView view = (PointImageView) v;
       view.setScaleType(PointImageView.ScaleType.MATRIX);
       float scale;
       xCoor = event.getX();
       yCoor = event.getY();
 
       switch (event.getAction() & MotionEvent.ACTION_MASK) 
       {
 
       case MotionEvent.ACTION_DOWN:
          savedMatrix.set(matrix);
          start.set(event.getX(), event.getY());
          Log.d(TAG, "mode=DRAG" );
          mode = DRAG;
          break;
       case MotionEvent.ACTION_UP: 
           view.setPoint(new Point((int) xCoor, (int) yCoor));
           break;
           
       case MotionEvent.ACTION_POINTER_UP:
          mode = NONE;
          Log.d(TAG, "mode=NONE" );
          break;
       case MotionEvent.ACTION_POINTER_DOWN: 
          oldDist = spacing(event);
          Log.d(TAG, "oldDist=" + oldDist);
          if (oldDist > 5f) {
             savedMatrix.set(matrix);
             midPoint(mid, event);
             mode = ZOOM;
             Log.d(TAG, "mode=ZOOM" );
          }
          break;
 
       case MotionEvent.ACTION_MOVE: 
          if (mode == DRAG) { 
             matrix.set(savedMatrix);
             if (view.getLeft() >= -392){
                matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
             }
          }
          else if (mode == ZOOM) { 
             float newDist = spacing(event);
            if (newDist > 5f) {
                matrix.set(savedMatrix);
                scale = newDist / oldDist; 
                matrix.postScale(scale, scale, mid.x, mid.y);
             }
          }
          break;
          
       }
        view.setImageMatrix(matrix);
 
        return true; // indicate event was handled
    }
 
    private float spacing(MotionEvent event) {
       float x = event.getX(0) - event.getX(1);
       float y = event.getY(0) - event.getY(1);
       return FloatMath.sqrt(x * x + y * y);
    }
 
    private void midPoint(PointF point, MotionEvent event) {
       float x = event.getX(0) + event.getX(1);
       float y = event.getY(0) + event.getY(1);
       point.set(x / 2, y / 2);
    }
           
}
вот код..выдал ошибку Binary XML File #6 Error inflating class PointImageView

Добавлено через 7 минут
вот разметка..
XML
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" >
  
<PointImageView android:id="@+id/PointimageView"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:scaleType="matrix" >
</PointImageView>
</FrameLayout>
Добавлено через 19 минут
XML
1
2
3
4
5
6
7
8
  
<view class="com.tatyana.proba2.PointImageView" 
    android:id="@+id/PointimageView"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:scaleType="matrix" />
 
</FrameLayout>
решила проблему http://stackoverflow.com/questions/1...nflating-class
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.05.2014, 12:58 #10
Tatiana_aha, так получилось?
0
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 13:21  [ТС] #11
YuraAAA, не рисует точку..
не понимаю..как напимер поставить точку на двойное нажатие? можете привести пример кода,пожааалуйста:-)

просто, вот в этом куске,как я понимаю, он по опусканию пальца на дисплей должен ставить точку..
Java
1
2
3
4
5
6
7
case MotionEvent.ACTION_DOWN:
          savedMatrix.set(matrix);
          start.set(event.getX(), event.getY());
          Log.d(TAG, "mode=DRAG" );
          mode = DRAG;
          view.setPoint(new Point((int) xCoor, (int) yCoor));
          break;
аа он не ставит..
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.05.2014, 13:45 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Tatiana_aha, я по-этому и сказал, что я не уверен, что будет работать =) Сейчас сам попробую =)

Добавлено через 10 минут
Tatiana_aha, угу, мой косяк.

1. Размер точки забыли:

Java
1
2
3
4
5
6
7
8
9
10
@Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        if (point != null) {
            Paint paint = new Paint();
            paint.setColor(Color.BLACK);
            paint.setStrokeWidth(10f); //Вот оно
            canvas.drawPoint(point.x, point.y, paint);
        }
    }
2. Надо ведь ткнуть view носом, что ей пора перерисовать себя:

Java
1
2
3
4
  public void setPoint(Point point) {
        this.point = point;
        invalidate(); //Вот он
    }
3. Вот так я тестил, работает:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MyActivity extends Activity implements View.OnTouchListener {
    /**
     * Called when the activity is first created.
     */
 
    private PointImageView pointImageView;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pointImageView = (PointImageView) findViewById(R.id.view);
        pointImageView.setOnTouchListener(this);
    }
 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        pointImageView.setPoint(new Point(x, y));
        return false;
    }
}
1
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 13:51  [ТС] #13
Йеххоу,ставит точку!!!!Спасибо огромнейшее за помощь
0
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
13.05.2014, 13:54 #14
Tatiana_aha, да пожалуйста. Но он будет ставить только одну точку. Чтобы каждое нажатие - новая точка, надо вводить массив/коллекцию точек и рисовать каждую.
0
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 14:05  [ТС] #15
YuraAAA, одной точки достаточно будет + запомнить ее координаты (с ними еще повожусь)

Добавлено через 6 минут
нужно будет передать координаты сей точки на другую форму..))
0
13.05.2014, 14:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 14:05
Привет! Вот еще темы с ответами:

Как нарисовать точку на pictureBox? - C#
Как нарисовать точку на pictureBox? Именно точку, в один пиксель. grFront.DrawLine(pen, i, j, i, j) не рисует вообще ...

Как нарисовать круг в месте, где произошел клик мышью - C#
тоесть, задание такое: каждый раз, когда я кликаю по форме мышкой, в этом месте рисуется круг. и так пока не наберется 12 кружнов. в каждый...

Как в билдере нарисовать точку по координатам - C++ Builder
При щелчке должна нарисоваться жирная точка по опрделенным координатам

Как вывести точку и нарисовать квадрат? - C++
Хотел бы узнать как мне в моей ОС на C++/C работать с графикой ибо интернете я нормального описания не нашёл. Как вывести точку и...


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

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

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