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

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

Войти
Регистрация
Восстановить пароль
 
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
#1

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

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

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

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

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

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

Может кто сталкивался и поделится соображениями по этому поводу.
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2015, 13:27     Сделать так, что бы прикосновения фиксировались только в определенной зоне
Посмотрите здесь:
Ребят, как сделать так, что бы фокус с одного editText переключался на другой? Android
Сделать так что бы размер кнопки неизменяемым, какой бы там текст не был Android
Android Как в Android Studio сделать так, что пользователь вводил функцию f(x)=? и точку?
Android Сделать что-бы иконки грузились не только исходя из dpi, но и из размеров экрана тоже?
Как узнать что устройство подключено к определенной wifi Android
Что не так? Android
Что не так с Marshmallow? Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
19.03.2015, 00:02     Сделать так, что бы прикосновения фиксировались только в определенной зоне #2
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
19.03.2015, 09:05  [ТС]     Сделать так, что бы прикосновения фиксировались только в определенной зоне #3
Spelcrawler, не то.
попробую обрисовать ситуацию наиболее просто:
есть форма и кнопка на ней...если я положу на форму, ну скажем, палец, и после попробую нажать на кнопку - она не будет нажиматься до того момента пока я не уберу палец...так вот, возможно ли сделать так, что бы форма не брала не себя фокус, а кнопка брала
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
19.03.2015, 09:27     Сделать так, что бы прикосновения фиксировались только в определенной зоне #4
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
Цитата Сообщение от androbro Посмотреть сообщение
если я положу на форму, ну скажем, палец, и после попробую нажать на кнопку - она не будет нажиматься до того момента пока я не уберу палец
Да ну это бред, нормально кнопка нажмется.
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
19.03.2015, 09:34  [ТС]     Сделать так, что бы прикосновения фиксировались только в определенной зоне #5
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Да ну это бред, нормально кнопка нажмется.
ну так сделайте helloworld и убедитесь в этом
Pablito
2414 / 1859 / 583
Регистрация: 12.05.2014
Сообщений: 6,596
Завершенные тесты: 1
19.03.2015, 09:42     Сделать так, что бы прикосновения фиксировались только в определенной зоне #6
а это не может быть связано с return true/false из листенера?
я что-то такое когда-то проходил
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
19.03.2015, 09:53     Сделать так, что бы прикосновения фиксировались только в определенной зоне #7
Цитата Сообщение от androbro Посмотреть сообщение
ну так сделайте helloworld и убедитесь в этом
У меня в приложении, которое сейчас пишу, есть графики на одном экране их 5 штук, и можно нажать сразу все 5 и отрабатывает все отлично.
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
19.03.2015, 10:09  [ТС]     Сделать так, что бы прикосновения фиксировались только в определенной зоне #8
Spelcrawler,
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
возможно для нашего взаимопонимания Вам стоит указать где пропущено "не на"
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
19.03.2015, 10:24     Сделать так, что бы прикосновения фиксировались только в определенной зоне #9
Цитата Сообщение от androbro Посмотреть сообщение
возможно для нашего взаимопонимания Вам стоит указать где пропущено "не на"
Во втором случае.
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
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.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
19.03.2015, 10:39     Сделать так, что бы прикосновения фиксировались только в определенной зоне #11
А если заменить onTouchEvent на onTouchListener?
Pablito
2414 / 1859 / 583
Регистрация: 12.05.2014
Сообщений: 6,596
Завершенные тесты: 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];
        }
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
19.03.2015, 10:49  [ТС]     Сделать так, что бы прикосновения фиксировались только в определенной зоне #13
Spelcrawler, в реализации вью нужен onTouchEvent, а если повесить на экземпляр DrawingView то что это даст.
Паблито, Вы имеете ввиду в реализации DrawingView возвращать false?
Pablito
2414 / 1859 / 583
Регистрация: 12.05.2014
Сообщений: 6,596
Завершенные тесты: 1
19.03.2015, 10:55     Сделать так, что бы прикосновения фиксировались только в определенной зоне #14
по идее
на область не занимаемую DrawingView
хотя там какой-то тег есть в xml, я смутно помню что надо сказать главному лаяуту что бы он не тормозил после получения onTouch а передавал событие дальше - дочерним вьюшкам

Не по теме:

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

androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
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">
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
30.03.2015, 12:59  [ТС]     Сделать так, что бы прикосновения фиксировались только в определенной зоне #16
upp
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
30.03.2015, 13:04     Сделать так, что бы прикосновения фиксировались только в определенной зоне #17
androbro, дак оно еще не заработало?)
Цитата Сообщение от androbro Посмотреть сообщение
в реализации вью нужен onTouchEvent, а если повесить на экземпляр DrawingView то что это даст.
Можно же в конструкторе повесить листенер обычным способом, не совсем хорошо конечно, но может будет работать как нужно?
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
30.03.2015, 13:19  [ТС]     Сделать так, что бы прикосновения фиксировались только в определенной зоне #18
Spelcrawler,
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Можно же в конструкторе повесить листенер обычным способом, не совсем хорошо конечно, но может будет работать как нужно?
сделал так:
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
    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);
        this.setOnTouchListener(new OnTouchListener(){
            @Override
            public boolean onTouch(View arg0, 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;
                }
            
        });
    }
работает аналогичным образом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2015, 12:33     Сделать так, что бы прикосновения фиксировались только в определенной зоне
Еще ссылки по теме:
Android Password что не так?
Android Что тут не так?
Android Что то не так с кодом
Что не так я делаю в адптаре Android
Подскажите что я делаю не так Android

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

Или воспользуйтесь поиском по форуму:
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 836
09.04.2015, 12:33  [ТС]     Сделать так, что бы прикосновения фиксировались только в определенной зоне #19
Ну собственно говоря вернулся как то к этой теме на досуге, после одного наблюдения - "если нажать на кнопку и удерживать ее нажатой, то есть возможность в это время нажать и на другую кнопку", это и натолкнуло меня на этот велосипед - а почему бы не зафигачить батон на всю разметку а поверх него уже наложить рисовалку
Сделать так, что бы прикосновения фиксировались только в определенной зоне
собственно ставим у фонового батона альфа = 0 и желаемое поведение достигнуто))профит на двух колесиках)))

теперь дело осталось за малым, так как люди в основном правши, а функциональные кнопки по умолчанию справа, то есть большая вероятность что юзер будет жимкать своей рукой нечаянно по ним...тут либо их надо вообще скрыть, либо перенести на левую сторону(да простят меня левши)
Yandex
Объявления
09.04.2015, 12:33     Сделать так, что бы прикосновения фиксировались только в определенной зоне
Ответ Создать тему
Опции темы

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