Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
1

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

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

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

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

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


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

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

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

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

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

Как сделать так что бы работали только определенные флешки
У нас разношерстный парк операционок от XP до 10ки, домена нет. Слышал, что это...

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

18
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
19.03.2015, 00:02 2
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
0
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
19.03.2015, 09:05  [ТС] 3
Spelcrawler, не то.
попробую обрисовать ситуацию наиболее просто:
есть форма и кнопка на ней...если я положу на форму, ну скажем, палец, и после попробую нажать на кнопку - она не будет нажиматься до того момента пока я не уберу палец...так вот, возможно ли сделать так, что бы форма не брала не себя фокус, а кнопка брала
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
19.03.2015, 09:27 4
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
Цитата Сообщение от androbro Посмотреть сообщение
если я положу на форму, ну скажем, палец, и после попробую нажать на кнопку - она не будет нажиматься до того момента пока я не уберу палец
Да ну это бред, нормально кнопка нажмется.
0
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
19.03.2015, 09:34  [ТС] 5
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Да ну это бред, нормально кнопка нажмется.
ну так сделайте helloworld и убедитесь в этом
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,581
Завершенные тесты: 1
19.03.2015, 09:42 6
а это не может быть связано с return true/false из листенера?
я что-то такое когда-то проходил
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
19.03.2015, 09:53 7
Цитата Сообщение от androbro Посмотреть сообщение
ну так сделайте helloworld и убедитесь в этом
У меня в приложении, которое сейчас пишу, есть графики на одном экране их 5 штук, и можно нажать сразу все 5 и отрабатывает все отлично.
0
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
19.03.2015, 10:09  [ТС] 8
Spelcrawler,
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
возможно для нашего взаимопонимания Вам стоит указать где пропущено "не на"
1
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
19.03.2015, 10:24 9
Цитата Сообщение от androbro Посмотреть сообщение
возможно для нашего взаимопонимания Вам стоит указать где пропущено "не на"
Во втором случае.
1
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
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
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
19.03.2015, 10:39 11
А если заменить onTouchEvent на onTouchListener?
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,581
Завершенные тесты: 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
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
19.03.2015, 10:49  [ТС] 13
Spelcrawler, в реализации вью нужен onTouchEvent, а если повесить на экземпляр DrawingView то что это даст.
Паблито, Вы имеете ввиду в реализации DrawingView возвращать false?
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,581
Завершенные тесты: 1
19.03.2015, 10:55 14
по идее
на область не занимаемую DrawingView
хотя там какой-то тег есть в xml, я смутно помню что надо сказать главному лаяуту что бы он не тормозил после получения onTouch а передавал событие дальше - дочерним вьюшкам

Не по теме:

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

1
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
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
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
30.03.2015, 12:59  [ТС] 16
upp
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
30.03.2015, 13:04 17
androbro, дак оно еще не заработало?)
Цитата Сообщение от androbro Посмотреть сообщение
в реализации вью нужен onTouchEvent, а если повесить на экземпляр DrawingView то что это даст.
Можно же в конструкторе повесить листенер обычным способом, не совсем хорошо конечно, но может будет работать как нужно?
0
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
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;
                }
            
        });
    }
работает аналогичным образом
0
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 898
09.04.2015, 12:33  [ТС] 19
Ну собственно говоря вернулся как то к этой теме на досуге, после одного наблюдения - "если нажать на кнопку и удерживать ее нажатой, то есть возможность в это время нажать и на другую кнопку", это и натолкнуло меня на этот велосипед - а почему бы не зафигачить батон на всю разметку а поверх него уже наложить рисовалку
Сделать так, что бы прикосновения фиксировались только в определенной зоне

собственно ставим у фонового батона альфа = 0 и желаемое поведение достигнуто))профит на двух колесиках)))

теперь дело осталось за малым, так как люди в основном правши, а функциональные кнопки по умолчанию справа, то есть большая вероятность что юзер будет жимкать своей рукой нечаянно по ним...тут либо их надо вообще скрыть, либо перенести на левую сторону(да простят меня левши)
0
09.04.2015, 12:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2015, 12:33

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

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

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


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

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

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