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

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

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

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

есть масштабируемая картинка (карта этажа здания), как прописать событие долгого нажатия(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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2014, 09:05
Ответы с готовыми решениями:

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

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

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

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

16
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 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
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
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 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
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 11:05  [ТС] 5
YuraAAA, ух, спасиибо огромное, сейчас попробую:-)
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 11:07 6
Tatiana_aha, пока что не за что. Я сам не проверял
0
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
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 11:28 8
Tatiana_aha, приведите к инту.

Java
1
new Point((int) your_float_X, (int) your_float_Y);
Покажите как свой код.
0
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/quest... ting-class
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 12:58 10
Tatiana_aha, так получилось?
0
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
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 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
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 13:51  [ТС] 13
Йеххоу,ставит точку!!!!Спасибо огромнейшее за помощь
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 13:54 14
Tatiana_aha, да пожалуйста. Но он будет ставить только одну точку. Чтобы каждое нажатие - новая точка, надо вводить массив/коллекцию точек и рисовать каждую.
0
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 14:05  [ТС] 15
YuraAAA, одной точки достаточно будет + запомнить ее координаты (с ними еще повожусь)

Добавлено через 6 минут
нужно будет передать координаты сей точки на другую форму..))
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.05.2014, 14:06 16
Tatiana_aha, если другая форма запускается интентом, то через интент (putInteger вроде)
0
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 14:11  [ТС] 17
хорошо, посмотрим, почитаем, покопаемся)
благодарствую еще раз за то, что не прошли мимо
0
13.05.2014, 14:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2014, 14:11
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru