Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте товарищи!

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

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


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

Может кто сталкивался и поделится соображениями по этому поводу.
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2015, 13:27
Ответы с готовыми решениями:

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

Как сделать так, чтобы обработка нажатия происходила только в одной определённой процедуре?
Как сделать так, чтобы обработка нажатия не происходила в определённой процедуре? Допустим чтобы...

Можно ли сделать так, чтобы программа начала выполнять что-либо заново с определённой строчки?
Хотелось бы, чтобы программа выполняла действия с 20 по 22 строку до тех пор пока я бы не ввёл...

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

18
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
19.03.2015, 00:02 2
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
0
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
19.03.2015, 09:05  [ТС] 3
Spelcrawler, не то.
попробую обрисовать ситуацию наиболее просто:
есть форма и кнопка на ней...если я положу на форму, ну скажем, палец, и после попробую нажать на кнопку - она не будет нажиматься до того момента пока я не уберу палец...так вот, возможно ли сделать так, что бы форма не брала не себя фокус, а кнопка брала
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
19.03.2015, 09:27 4
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
Цитата Сообщение от androbro Посмотреть сообщение
если я положу на форму, ну скажем, палец, и после попробую нажать на кнопку - она не будет нажиматься до того момента пока я не уберу палец
Да ну это бред, нормально кнопка нажмется.
0
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
19.03.2015, 09:34  [ТС] 5
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Да ну это бред, нормально кнопка нажмется.
ну так сделайте helloworld и убедитесь в этом
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
19.03.2015, 09:42 6
а это не может быть связано с return true/false из листенера?
я что-то такое когда-то проходил
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
19.03.2015, 09:53 7
Цитата Сообщение от androbro Посмотреть сообщение
ну так сделайте helloworld и убедитесь в этом
У меня в приложении, которое сейчас пишу, есть графики на одном экране их 5 штук, и можно нажать сразу все 5 и отрабатывает все отлично.
0
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
19.03.2015, 10:09  [ТС] 8
Spelcrawler,
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Ну дак вешайте листенеры на те вьюшки которые вам нужны, а на весь экран.
возможно для нашего взаимопонимания Вам стоит указать где пропущено "не на"
1
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
19.03.2015, 10:24 9
Цитата Сообщение от androbro Посмотреть сообщение
возможно для нашего взаимопонимания Вам стоит указать где пропущено "не на"
Во втором случае.
1
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
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
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
19.03.2015, 10:39 11
А если заменить onTouchEvent на onTouchListener?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
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
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
19.03.2015, 10:49  [ТС] 13
Spelcrawler, в реализации вью нужен onTouchEvent, а если повесить на экземпляр DrawingView то что это даст.
Паблито, Вы имеете ввиду в реализации DrawingView возвращать false?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
19.03.2015, 10:55 14
по идее
на область не занимаемую DrawingView
хотя там какой-то тег есть в xml, я смутно помню что надо сказать главному лаяуту что бы он не тормозил после получения onTouch а передавал событие дальше - дочерним вьюшкам

Не по теме:

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

1
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
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
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
30.03.2015, 12:59  [ТС] 16
upp
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
30.03.2015, 13:04 17
androbro, дак оно еще не заработало?)
Цитата Сообщение от androbro Посмотреть сообщение
в реализации вью нужен onTouchEvent, а если повесить на экземпляр DrawingView то что это даст.
Можно же в конструкторе повесить листенер обычным способом, не совсем хорошо конечно, но может будет работать как нужно?
0
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
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
393 / 338 / 83
Регистрация: 17.10.2014
Сообщений: 1,007
09.04.2015, 12:33  [ТС] 19
Ну собственно говоря вернулся как то к этой теме на досуге, после одного наблюдения - "если нажать на кнопку и удерживать ее нажатой, то есть возможность в это время нажать и на другую кнопку", это и натолкнуло меня на этот велосипед - а почему бы не зафигачить батон на всю разметку а поверх него уже наложить рисовалку
Сделать так, что бы прикосновения фиксировались только в определенной зоне

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

теперь дело осталось за малым, так как люди в основном правши, а функциональные кнопки по умолчанию справа, то есть большая вероятность что юзер будет жимкать своей рукой нечаянно по ним...тут либо их надо вообще скрыть, либо перенести на левую сторону(да простят меня левши)
0
09.04.2015, 12:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2015, 12:33
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

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