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

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

Войти
Регистрация
Восстановить пароль
 
 
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 843
#1

Сделать так, что бы прикосновения фиксировались только в определенной зоне - Программирование Android

18.03.2015, 13:27. Просмотров 495. Ответов 18
Метки нет (Все метки)

Здравствуйте товарищи!

Есть layout на котором размещена кастомная вьюха(рисовалка) и несколько кнопок.
На данный момент если попытаться нарисовать что то на ней когда рука касается(лежит на) дисплея естественно не получится.

Возможно ли сделать так, что бы прикосновения экрана фиксировалось только в определенной зоне(собственно только на рисовалке, ну и кнопках), как на рисунке:
Сделать так, что бы прикосновения фиксировались только в определенной зоне

Что бы фокус имели только рисовалка и кнопки, а так сказать background не имел, если можно так выразится.

Может кто сталкивался и поделится соображениями по этому поводу.
Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2015, 13:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сделать так, что бы прикосновения фиксировались только в определенной зоне (Программирование Android):

Сделать так, что бы форма отвечала на нажатие мыши только в определенной области - C#
В общем как сделать так, что бы форма отвечала на нажатие мыши только в определенной области. В другом месте её как бы нет, но она есть, и...

Сделать так что бы в файл записывались только отличники - C++
Ребят, программа рабочая, не могу только сделать так что бы в файл записывались только отличники, помогите #include "stdafx.h" #include...

Сделать так, что бы работали только определенные флешки - Ubuntu Linux
И как это сделать на линуксе?

Как сделать так что бы работали только определенные флешки - Администрирование Windows
У нас разношерстный парк операционок от XP до 10ки, домена нет. Слышал, что это можно сделать на касперском, но у нас 360. Да и вообще...

Как сделать так что бы мои шрифты отображались не только у меня? - Delphi
Дело в том что у меня все нормально отображается, а друга крякозябры. А если я вошью шрифты то будут ли нормально они отображается у всех?

Как сделать так, что б в коде использовалось только две переменных? - Pascal ABC
Естьготовый код: var a,b,s,r,d,c:real; begin write('a= '); readln(a); if a=0 then begin writeln('wrong symbol,try again');...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
19.03.2015, 00:02 #2
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
0
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 843
19.03.2015, 09:05  [ТС] #3
Spelcrawler, не то.
попробую обрисовать ситуацию наиболее просто:
есть форма и кнопка на ней...если я положу на форму, ну скажем, палец, и после попробую нажать на кнопку - она не будет нажиматься до того момента пока я не уберу палец...так вот, возможно ли сделать так, что бы форма не брала не себя фокус, а кнопка брала
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
19.03.2015, 09:27 #4
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
Цитата Сообщение от androbro Посмотреть сообщение
если я положу на форму, ну скажем, палец, и после попробую нажать на кнопку - она не будет нажиматься до того момента пока я не уберу палец
Да ну это бред, нормально кнопка нажмется.
0
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 843
19.03.2015, 09:34  [ТС] #5
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Да ну это бред, нормально кнопка нажмется.
ну так сделайте helloworld и убедитесь в этом
0
Pablito
2484 / 1929 / 600
Регистрация: 12.05.2014
Сообщений: 6,781
Завершенные тесты: 1
19.03.2015, 09:42 #6
а это не может быть связано с return true/false из листенера?
я что-то такое когда-то проходил
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
19.03.2015, 09:53 #7
Цитата Сообщение от androbro Посмотреть сообщение
ну так сделайте helloworld и убедитесь в этом
У меня в приложении, которое сейчас пишу, есть графики на одном экране их 5 штук, и можно нажать сразу все 5 и отрабатывает все отлично.
0
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 843
19.03.2015, 10:09  [ТС] #8
Spelcrawler,
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
возможно для нашего взаимопонимания Вам стоит указать где пропущено "не на"
1
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
19.03.2015, 10:24 #9
Цитата Сообщение от androbro Посмотреть сообщение
возможно для нашего взаимопонимания Вам стоит указать где пропущено "не на"
Во втором случае.
1
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 843
19.03.2015, 10:36  [ТС] #10
я по всей видимости чего то не понимаю, вот самопальная вьюха(смысловой нагрузки не несет - самая простая рисовалка):
Кликните здесь для просмотра всего текста
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
    public class DrawingView extends View {
 
        public int width;
        public int height;
        private Bitmap mBitmap;
        private Canvas mCanvas;
        private Path mPath;
        private Paint mBitmapPaint;
        Context context;
        private Paint circlePaint;
        private Path circlePath;
 
        public DrawingView(Context c) {
            super(c);
            context = c;
            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
            circlePaint = new Paint();
            circlePath = new Path();
            circlePaint.setAntiAlias(true);
            circlePaint.setColor(Color.BLUE);
            circlePaint.setStyle(Paint.Style.STROKE);
            circlePaint.setStrokeJoin(Paint.Join.MITER);
            circlePaint.setStrokeWidth(4f);
 
        }
 
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
 
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
 
        }
 
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
 
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
            canvas.drawPath(mPath, mPaint);
            canvas.drawPath(circlePath, circlePaint);
        }
 
        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 1;
 
        private void touch_start(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }
 
        private void touch_move(float x, float y) {
            float dx = Math.abs(x - mX);
            float dy = Math.abs(y - mY);
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
                mX = x;
                mY = y;
            }
        }
 
        private void touch_up() {
            mPath.lineTo(mX, mY);
            circlePath.reset();
            mCanvas.drawPath(mPath, mPaint);
            mPath.reset();
        }
 
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX();
            float y = event.getY();
 
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touch_start(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touch_move(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touch_up();
                invalidate();
                break;
            }
            return true;
        }

Допустим размещается она на лейауте и занимает половину экрана. Пользователь планшета может положить руку на область не занимаемую DrawingView и начать рисовать, но onTouchEvent в DrawingView не отрабатывает, так как фокус(или как он там называется) щас находится за пределами DrawingView.
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
19.03.2015, 10:39 #11
А если заменить onTouchEvent на onTouchListener?
0
Pablito
2484 / 1929 / 600
Регистрация: 12.05.2014
Сообщений: 6,781
Завершенные тесты: 1
19.03.2015, 10:45 #12
я извиняюсь что настаиваю, просто проверить сам сейчас не могу:
Java
1
2
3
4
5
6
@Override
        public boolean onTouchEvent(MotionEvent event) {
        ... skiped
 
        return [B]false[/B];
        }
0
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 843
19.03.2015, 10:49  [ТС] #13
Spelcrawler, в реализации вью нужен onTouchEvent, а если повесить на экземпляр DrawingView то что это даст.
Паблито, Вы имеете ввиду в реализации DrawingView возвращать false?
0
Pablito
2484 / 1929 / 600
Регистрация: 12.05.2014
Сообщений: 6,781
Завершенные тесты: 1
19.03.2015, 10:55 #14
по идее
на область не занимаемую DrawingView
хотя там какой-то тег есть в xml, я смутно помню что надо сказать главному лаяуту что бы он не тормозил после получения onTouch а передавал событие дальше - дочерним вьюшкам

Не по теме:

пойду почитаю как сделать мультитач на эмуляторе и попробую проверить

1
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 843
19.03.2015, 11:13  [ТС] #15
Цитата Сообщение от Паблито Посмотреть сообщение
после получения onTouch а передавал событие дальше - дочерним вьюшкам
вот именно это и необходимо

Добавлено через 11 минут
вот код рабочей кастомной вьюхи если кому для эксперимента над:
Кликните здесь для просмотра всего текста
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
public class DrawingView extends View {
 
    public int width;
    public int height;
    private Bitmap mBitmap;
    private Canvas mCanvas;
    private Path mPath;
    private Paint mBitmapPaint;
    Context context;
    private Paint mPaint;
 
    public DrawingView(Context c, AttributeSet attrs) {
        super(c, attrs);
        context = c;
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.BLUE);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.MITER);
        mPaint.setStrokeWidth(4f);
 
    }
 
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
 
        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
 
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
 
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
        canvas.drawPath(mPath, mPaint);
    }
 
    private float mX, mY;
    private static final float TOUCH_TOLERANCE = 1;
 
    private void touch_start(float x, float y) {
        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;
    }
 
    private void touch_move(float x, float y) {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
            mX = x;
            mY = y;
        }
    }
 
    private void touch_up() {
        mPath.lineTo(mX, mY);
        mCanvas.drawPath(mPath, mPaint);
        mPath.reset();
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
 
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up();
            invalidate();
            break;
        }
        return true;
    }
}

в обычный helloworld вставляется просто в xml:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
<*.*.*.DrawingView
        android:id="@+id/DrawingView"
        android:layout_width="200dp"
        android:layout_height="150dp">
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2015, 11:13
Привет! Вот еще темы с ответами:

Как сделать так что бы код выполнялся только при нажатии (удерживании кнопки)? - Visual Basic .NET
Как сделать так что бы код выполнялся только при нажатии (удерживании кнопки)? то есть нажал я на кнопку а в Picturebox появилась...

Сделать так что бы на событие mouseEnter реагировал только canvas, но не реагировали находящиеся в нем компонеты - C# WPF
вдруг &lt;Canvas.Triggers&gt; &lt;EventTrigger RoutedEvent=&quot;Canvas.MouseEnter&quot;&gt; ...

Как сделать так что бы добавлял ту же структуру но только пустые поля для ввода новых параметров? - jQuery
Приветствую! Пожалуйста посоветуйте или помогите решить возможно легкий вопрос: Мало что знаю о JQ нашел вот такой код: ...

Никак не могу сделать так что б в строке сканировалось только одно слово,а не сразу вся фраза - C#
Добрый день,я новичек в написании программ,нужен совет. Хочу написать програмку что-то вроде вопрос\ответ. Никак не могу сделать так что...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.03.2015, 11:13
Ответ Создать тему
Опции темы

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