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

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

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

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

13.05.2014, 09:05. Просмотров 933. Ответов 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;
        }
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2014, 09:05     Как нарисовать точку в месте долгого нажатия?
Посмотрите здесь:

Как нарисовать Bitmap на Canvas'е Android
LogCat, как понять по логам в каком месте кода произощла ошибка? Android
Удаление сообщения (SMS) путем долгого тапа Android
Как работает шаблон NavigationDrawer в AndroidStudio, где обрабатывать нажатия на навигационной панели? Android
Android OnTouchEvent - нарисовать точку
Как нарисовать анимированную линию Android
Android Как поймать событие нажатия пальцами на экран?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 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);
        }
    }
}
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) {
//ТУТ?
 
}
и передать в координаты точки координаты нажатия..?
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 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()));
                }
Должно работать
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 11:05  [ТС]     Как нарисовать точку в месте долгого нажатия? #5
YuraAAA, ух, спасиибо огромное, сейчас попробую:-)
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
13.05.2014, 11:07     Как нарисовать точку в месте долгого нажатия? #6
Tatiana_aha, пока что не за что. Я сам не проверял
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..
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
13.05.2014, 11:28     Как нарисовать точку в месте долгого нажатия? #8
Tatiana_aha, приведите к инту.

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

Добавлено через 6 минут
нужно будет передать координаты сей точки на другую форму..))
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
13.05.2014, 14:06     Как нарисовать точку в месте долгого нажатия? #16
Tatiana_aha, если другая форма запускается интентом, то через интент (putInteger вроде)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 14:11     Как нарисовать точку в месте долгого нажатия?
Еще ссылки по теме:

Android Отображение картинки в месте нажатия на экран
Как сделать, чтобы элемент пропускал сквозь себя нажатия Android
Android Как можно нарисовать многоугольник
Android Как убрать эффект нажатия в TabLayout
Как восстановить значения при открытии приложения после нажатия кнопки назад Android

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

Или воспользуйтесь поиском по форуму:
Tatiana_aha
2 / 2 / 0
Регистрация: 01.05.2011
Сообщений: 30
13.05.2014, 14:11  [ТС]     Как нарисовать точку в месте долгого нажатия? #17
хорошо, посмотрим, почитаем, покопаемся)
благодарствую еще раз за то, что не прошли мимо
Yandex
Объявления
13.05.2014, 14:11     Как нарисовать точку в месте долгого нажатия?
Ответ Создать тему
Опции темы

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