Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30

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

13.05.2014, 09:05. Показов 2713. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.05.2014, 09:05
Ответы с готовыми решениями:

Обработка долгого нажатия кнопки
Оговорюсь что читал похожую тему на форуме и умею пользоватся поиском (так думаю)! Есть задача обработать короткое и длинное нажатие...

Как нарисовать точку?
Как нарисовать точку? Я искал в интернете как нарисовать точку не нашел ничего. Кто-нибудь подскажите как это сделать?

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

16
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 10:32
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  [ТС]
YuraAAA, я учусь по мере продвижения своего проекта-диплома..все в первый раз и "все сразу"(простите уж)

т.е. мы можем этот этот код использовать тут
Java
1
2
3
4
5
private void handleLongPress(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
//ТУТ?
 
}
и передать в координаты точки координаты нажатия..?
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 10:57
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  [ТС]
YuraAAA, ух, спасиибо огромное, сейчас попробую:-)
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 11:07
Tatiana_aha, пока что не за что. Я сам не проверял
0
 Аватар для Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 11:25  [ТС]
говорит,
Java
1
The constructor Point(float, float) is undefined
..

у меня в коде
Java
1
2
 xCoor = event.getX();
       yCoor = event.getY();
, где xCoor и yCoor типа float..
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 11:28
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  [ТС]
прошу прощения, инет не дает работать никак(
вот код:
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/quest... ting-class
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 12:58
Tatiana_aha, так получилось?
0
 Аватар для Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 13:21  [ТС]
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
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 13:45
Лучший ответ Сообщение было отмечено Tatiana_aha как решение

Решение

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  [ТС]
Йеххоу,ставит точку!!!!Спасибо огромнейшее за помощь
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 13:54
Tatiana_aha, да пожалуйста. Но он будет ставить только одну точку. Чтобы каждое нажатие - новая точка, надо вводить массив/коллекцию точек и рисовать каждую.
0
 Аватар для Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 14:05  [ТС]
YuraAAA, одной точки достаточно будет + запомнить ее координаты (с ними еще повожусь)

Добавлено через 6 минут
нужно будет передать координаты сей точки на другую форму..))
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 14:06
Tatiana_aha, если другая форма запускается интентом, то через интент (putInteger вроде)
0
 Аватар для Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 14:11  [ТС]
хорошо, посмотрим, почитаем, покопаемся)
благодарствую еще раз за то, что не прошли мимо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2014, 14:11
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru