Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Tatiana_aha
2 / 2 / 1
Регистрация: 01.05.2011
Сообщений: 30
#1

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

13.05.2014, 09:05. Просмотров 1129. Ответов 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;
        }
    }

http://www.cyberforum.ru/android-dev/thread1783946.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2014, 09:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как нарисовать точку в месте долгого нажатия? (Программирование Android):

OnTouchEvent - нарисовать точку
Здравствуйте! Уже который час мучаюсь с программой. В том месте где...

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

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

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

Как нарисовать точку на pictureBox?
Как нарисовать точку на pictureBox? Именно точку, в один пиксель....

16
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 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 / 1
Регистрация: 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
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 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 / 1
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 11:05  [ТС] #5
YuraAAA, ух, спасиибо огромное, сейчас попробую:-)
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
13.05.2014, 11:07 #6
Tatiana_aha, пока что не за что. Я сам не проверял
0
Tatiana_aha
2 / 2 / 1
Регистрация: 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
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 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 / 1
Регистрация: 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
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
13.05.2014, 12:58 #10
Tatiana_aha, так получилось?
0
Tatiana_aha
2 / 2 / 1
Регистрация: 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
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
13.05.2014, 13:45 #12
Лучший ответ Сообщение было отмечено 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 / 1
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 13:51  [ТС] #13
Йеххоу,ставит точку!!!!Спасибо огромнейшее за помощь
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
13.05.2014, 13:54 #14
Tatiana_aha, да пожалуйста. Но он будет ставить только одну точку. Чтобы каждое нажатие - новая точка, надо вводить массив/коллекцию точек и рисовать каждую.
0
Tatiana_aha
2 / 2 / 1
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 14:05  [ТС] #15
YuraAAA, одной точки достаточно будет + запомнить ее координаты (с ними еще повожусь)

Добавлено через 6 минут
нужно будет передать координаты сей точки на другую форму..))
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
13.05.2014, 14:06 #16
Tatiana_aha, если другая форма запускается интентом, то через интент (putInteger вроде)
0
Tatiana_aha
2 / 2 / 1
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 14:11  [ТС] #17
хорошо, посмотрим, почитаем, покопаемся)
благодарствую еще раз за то, что не прошли мимо
0
13.05.2014, 14:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 14:11
Привет! Вот еще темы с решениями:

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

Как в Qt нарисовать точку в консоле?
Можно ли в консоле в Qt поставить пиксель. Если не Qt то можно: #include...

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

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


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

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

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