Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 21 ноя 2018, 21:02

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 18 июн 2016, 18:11 

Зарегистрирован: 08 окт 2015, 17:48
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
вот пример https://gyazo.com/39b76d3e992dba4c369f428c9459c8a1 этот смайл должен двигаться , когда я буду перемещать палец по этой черной области (типо тачпад на экране) . Пробовал возможности движка andengine и ничего готового не нашел, везде нужно прикоснуться к самому спрайту. Как под себя переделать аналоговое управление джостиком, который в движке andengine я тоже не понял, дошел до того, что там надо менять всю конструкцию метода. Решил самому написать всё это. Следующее, что нашел на просторах интернета, это Canvas. Сделал всё как тут https://habrahabr.ru/sandbox/27511/. на экране есть этот смайл , который перерисовывается там где я кликну. Вот тут я получаю координаты касания
Код: [ Загрузить ] [ Скрыть ]
  1. public boolean onTouchEvent(MotionEvent event) { 
  2.             if(event.getAction() == MotionEvent.ACTION_DOWN) { 
  3.                 touchX = event.getX(); 
  4.                 touchY = event.getY(); 
  5.                 invalidate(); } 
  6.             return true; 
  7.         } 

и перерисовываю смайл в новых координатах.
Но мне нужно , чтобы касания отлавливались только в определенной области экрана и далее я их буду подставлять и без invalidate() (пока не пробовал без него рисовать) перерисовывать этот смайл, только придется как то корректировать эти координаты. Ведь нужно подставлять не сами координаты , а изменение координаты. Т.е. нажал на область тачпад и начинаю двигать пальцем и будет отслеживаться разница между координатами и непрерывно передаваться для рисования . буду прибавлять к имеющимся координатам смайла эту разницу , а n-кратное увеличение или уменьшение этих координат позволит регулировать чувствительность тачпада. И еще решается такая проблема, которую я видел в начале, если коснуться смайлика пальцем и двигать его то смайлик начинает отставать от пальца, не достаточно быстро перерисовывается что ли..

Так вот нужна помощь с тем, чтобы определить область с которой считываются координаты касания, вернее изменения этой координаты от точки касания по движению. Спасибо, буду рад любому указанию к нужным методам и способам. или же может кто посоветует более разумный или эффективный способ реализации моей задачи.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 июн 2016, 17:50 

Зарегистрирован: 30 мар 2015, 17:16
Сообщений: 68
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Turalllb писал(а):
вот пример https://gyazo.com/39b76d3e992dba4c369f428c9459c8a1 этот смайл должен двигаться , когда я буду перемещать палец по этой черной области (типо тачпад на экране) . Пробовал возможности движка andengine и ничего готового не нашел, везде нужно прикоснуться к самому спрайту. Как под себя переделать аналоговое управление джостиком, который в движке andengine я тоже не понял, дошел до того, что там надо менять всю конструкцию метода. Решил самому написать всё это. Следующее, что нашел на просторах интернета, это Canvas. Сделал всё как тут https://habrahabr.ru/sandbox/27511/. на экране есть этот смайл , который перерисовывается там где я кликну. Вот тут я получаю координаты касания
Код: [ Загрузить ] [ Скрыть ]
  1. public boolean onTouchEvent(MotionEvent event) { 
  2.             if(event.getAction() == MotionEvent.ACTION_DOWN) { 
  3.                 touchX = event.getX(); 
  4.                 touchY = event.getY(); 
  5.                 invalidate(); } 
  6.             return true; 
  7.         } 

и перерисовываю смайл в новых координатах.
Но мне нужно , чтобы касания отлавливались только в определенной области экрана и далее я их буду подставлять и без invalidate() (пока не пробовал без него рисовать) перерисовывать этот смайл, только придется как то корректировать эти координаты. Ведь нужно подставлять не сами координаты , а изменение координаты. Т.е. нажал на область тачпад и начинаю двигать пальцем и будет отслеживаться разница между координатами и непрерывно передаваться для рисования . буду прибавлять к имеющимся координатам смайла эту разницу , а n-кратное увеличение или уменьшение этих координат позволит регулировать чувствительность тачпада. И еще решается такая проблема, которую я видел в начале, если коснуться смайлика пальцем и двигать его то смайлик начинает отставать от пальца, не достаточно быстро перерисовывается что ли..

Так вот нужна помощь с тем, чтобы определить область с которой считываются координаты касания, вернее изменения этой координаты от точки касания по движению. Спасибо, буду рад любому указанию к нужным методам и способам. или же может кто посоветует более разумный или эффективный способ реализации моей задачи.

Здравствуйте! Вообще для этих целей есть Drag and Drop
https://developer.android.com/guide/topics/ui/drag-drop.html
Если, Вы, используете Activity, то вот простенький пример от которого можно дальше плясать:
drag_layout
Код: [ Загрузить ] [ Скрыть ]
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" android:layout_width="match_parent" 
  4.     android:layout_height="match_parent" 
  5.     android:paddingRight="16dp" 
  6.     android:paddingLeft="16dp" 
  7.     android:paddingTop="8dp" 
  8.     android:layout_gravity="center"> 
  9.     <TextView 
  10.         android:id="@+id/option1" 
  11.         android:layout_width="match_parent" 
  12.         android:layout_height="wrap_content" 
  13.         android:layout_marginTop="16dp" 
  14.         android:background="@color/rainbow_yellow" 
  15.         android:text="TextView 1" 
  16.         android:gravity="center" 
  17.         android:textSize="20sp"/> 
  18.     <TextView 
  19.         android:id="@+id/option2" 
  20.         android:layout_width="match_parent" 
  21.         android:layout_height="wrap_content" 
  22.         android:layout_marginTop="16dp" 
  23.         android:background="@color/rainbow_yellow" 
  24.         android:text="TextView 2" 
  25.         android:gravity="center" 
  26.         android:textSize="20sp"/> 
  27.     <TextView 
  28.         android:id="@+id/option3" 
  29.         android:layout_width="match_parent" 
  30.         android:layout_height="wrap_content" 
  31.         android:layout_marginTop="16dp" 
  32.         android:background="@color/rainbow_yellow" 
  33.         android:text="TextView 3" 
  34.         android:gravity="center" 
  35.         android:textSize="20sp"/> 
  36.     <TextView 
  37.         android:id="@+id/choice_1" 
  38.         android:layout_width="match_parent" 
  39.         android:layout_height="wrap_content" 
  40.         android:layout_marginTop="32dp" 
  41.         android:background="@color/rainbow_green" 
  42.         android:text="TextView 4" 
  43.         android:gravity="center" 
  44.         android:textSize="20sp"/> 
  45.     <TextView 
  46.         android:id="@+id/choice_2" 
  47.         android:layout_width="match_parent" 
  48.         android:layout_height="wrap_content" 
  49.         android:layout_marginTop="16dp" 
  50.         android:background="@color/rainbow_green" 
  51.         android:text="TextView 5" 
  52.         android:gravity="center" 
  53.         android:textSize="20sp"/> 
  54.     <TextView 
  55.         android:id="@+id/choice_3" 
  56.         android:layout_width="match_parent" 
  57.         android:layout_height="wrap_content" 
  58.         android:layout_marginTop="16dp" 
  59.         android:background="@color/rainbow_green" 
  60.         android:text="TextView 6" 
  61.         android:gravity="center" 
  62.         android:textSize="20sp"/> 
  63.  
  64. </LinearLayout> 

TestActivity
Код: [ Загрузить ] [ Скрыть ]
  1. import android.content.ClipData; 
  2. import android.graphics.Typeface; 
  3. import android.os.Bundle; 
  4. import android.support.annotation.Nullable; 
  5. import android.support.v7.app.AppCompatActivity; 
  6. import android.view.DragEvent; 
  7. import android.view.MotionEvent; 
  8. import android.view.View; 
  9. import android.widget.TextView; 
  10.  
  11. /** 
  12. * Created by 1 on 26.05.2016. 
  13. */ 
  14. public class TestActivity extends AppCompatActivity { 
  15.     private TextView option1, option2, option3, choice1, choice2, choice3; 
  16.  
  17.     @Override 
  18.     protected void onCreate(@Nullable Bundle savedInstanceState) { 
  19.         super.onCreate(savedInstanceState); 
  20.         setContentView(R.layout.drag_layout); 
  21.  
  22.         // компоненты для перетаскивания 
  23.         option1 = (TextView) findViewById(R.id.option1); 
  24.         option2 = (TextView) findViewById(R.id.option2); 
  25.         option3 = (TextView) findViewById(R.id.option3); 
  26.         // компоненты для приема 
  27.         choice1 = (TextView) findViewById(R.id.choice_1); 
  28.         choice2 = (TextView) findViewById(R.id.choice_2); 
  29.         choice3 = (TextView) findViewById(R.id.choice_3); 
  30.  
  31.         // слушатели 
  32.         option1.setOnTouchListener(new ChoiceTouchListener()); 
  33.         option2.setOnTouchListener(new ChoiceTouchListener()); 
  34.         option3.setOnTouchListener(new ChoiceTouchListener()); 
  35.         choice1.setOnDragListener(new ChoiceDragListener()); 
  36.         choice2.setOnDragListener(new ChoiceDragListener()); 
  37.         choice3.setOnDragListener(new ChoiceDragListener()); 
  38.  
  39.     } 
  40.  
  41.        private final class ChoiceTouchListener implements View.OnTouchListener { 
  42.             public boolean onTouch(View view, MotionEvent motionEvent) { 
  43.                 if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
  44.                     ClipData data = ClipData.newPlainText("", ""); 
  45.                     View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder( 
  46.                             view); 
  47.                     view.startDrag(data, shadowBuilder, view, 0); 
  48.                     return true; 
  49.                 } else { 
  50.                     return false; 
  51.                 } 
  52.             } 
  53.         } 
  54.  
  55.     private class ChoiceDragListener implements View.OnDragListener { 
  56.         @Override 
  57.         public boolean onDrag(View v, DragEvent event) { 
  58.             switch (event.getAction()) { 
  59.                 case DragEvent.ACTION_DRAG_STARTED: 
  60.                     // не обрабатываем 
  61.                     break; 
  62.                 case DragEvent.ACTION_DRAG_ENTERED: 
  63.                     // не обрабатываем 
  64.                     break; 
  65.                 case DragEvent.ACTION_DRAG_EXITED: 
  66.                     // не обрабатываем 
  67.                     break; 
  68.                 case DragEvent.ACTION_DROP: 
  69.                     View view = (View) event.getLocalState(); 
  70.                     // прячем элемент, на который был сброшен компонент 
  71.                     view.setVisibility(View.INVISIBLE); 
  72.                     TextView dropTarget = (TextView) v; 
  73.                     TextView dropped = (TextView) view; 
  74.                     // меняем текст у принимающего элемента 
  75.                     dropTarget.setText(dropped.getText()); 
  76.                     // делаем его жирным, чтобы было видно, что операция получилась 
  77.                     dropTarget.setTypeface(Typeface.DEFAULT_BOLD); 
  78.                     // если на объект уже сбрасывали элемент, то реагируем на эту ситуацию 
  79.                     Object tag = dropTarget.getTag(); 
  80.                     if (tag != null) { 
  81.                         int existingID = (Integer) tag; 
  82.                         // делаем источник видимым 
  83.                         findViewById(existingID).setVisibility(View.VISIBLE); 
  84.                     } 
  85.                     // устанавливаем тег, используя его ID 
  86.                     dropTarget.setTag(dropped.getId()); 
  87.                     dropTarget.setTextColor(getResources().getColor(R.color.rainbow_purple)); 
  88.                     dropTarget.setBackgroundColor(getResources().getColor(R.color.rainbow_yellow)); 
  89.                     break; 
  90.                 case DragEvent.ACTION_DRAG_ENDED: 
  91.                     // не обрабатываем 
  92.                     break; 
  93.                 default: 
  94.                     break; 
  95.             } 
  96.             return true; 
  97.         } 
  98.     } 

Тогда, в Вашем случае, если чёрный квадратик сделать как View-элемент то можно отслеживать координаты этого элемента либо когда вызывается startDrag() (ACTION_DRAG_STARTED через методы getX()и getY()), либо когда перетаскивание заканчивается внутри границ компонента где будет находиться квадратик (View-элемент) (ACTION_DROP так же через методы getX()и getY()). А самим компонентом, внутри границ которого мы перетаскиваем наш квадратик может быть что угодно, даже сам родительский Layout, внутри которого находиться наш квадрат. Кроме этого у метода слушателя OnDragListener.onDrag() можно отслеживать и другие события:
ACTION_DRAG_ENTERED: посылается компоненту, когда перетаскивание происходит в его границах;
ACTION_DRAG_EXITED: посылается компоненту, когда перетаскивание выходит за его пределы;
ACTION_DRAG_LOCATION: посылается компоненту между ACTION_DRAG_ENTERED и ACTION_DRAG_EXITED с текущей позицией перетаскивания внутри компонента. Местоположение объекта можно получить через методы getX()и getY();
ACTION_DRAG_ENDED: рассылается всем компонентам, когда текущее перетаскивание заканчивается. Результат перетаскивания можно получить через метод getResult().
Соответственно, Вы можете унаследовать от интерфейсов-слушателей OnDragListener и OnTouchListener и не в классе активности, а и в SurfaceView (или где Вы там работаете) и переопределить методы onDrag и onTouch так как Вам это будет нужно.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 июн 2016, 22:07 

Зарегистрирован: 08 окт 2015, 17:48
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Drag and Drop ммм..интересно. пойду читать, разбираться. Я подозревал, что есть много способов реализовать то , что я хочу, но ввиду моих слабых знаний я просто взял и в методе onTouchEvent ,который у меня отлавливал касания по всему экрану , добавил пару условий If , который просто задают координаты поля квадрата. Только полученные в этом поле значения координат используются в коде. Но проблема оказалась в том, что в ACTION_DOWN условие не выполняется, в нем отлавливается только первое касание , а как я двинул палец то уходит в ACTION_MOVE, а тут уже я не могу получить текущую и прошлую координату, чтобы получать их разницу.. где то видел про историю координат и еще в GestureDetector метод Filing который дает и первое касание и текущую координату . надо разобраться как это сделать. и вообще GestureDetector выходит аналог от onTouchEvent и отличается только структурой?
Код: [ Загрузить ] [ Скрыть ]
  1. switch (event.getAction()) { 
  2.                 case MotionEvent.ACTION_DOWN: 
  3.                        korX = touchX; 
  4.                        korY = touchY; 
  5.                         if((event.getRawY()> heigth*0.827) && (event.getRawX() > width * 0.2291) && event.getRawX() < width *0.7701 ){ 
  6.  
  7.                         initX = event.getRawX(); 
  8.                         initY = event.getRawY(); 
  9.                         } 
  10.                     return true; 
  11.                case MotionEvent.ACTION_MOVE: 
  12.  
  13.                        
  14.  
  15.                    if((event.getRawY()> heigth*0.827) && (event.getRawX() > width * 0.2291) && event.getRawX() < width *0.7701 ){ 
  16.  
  17.                        touchX = (korX + 2*(event.getRawX() - initX)); 
  18.                        touchY = (korY + 2*(event.getRawY() - initY)); 
  19.                    } 
  20.                    
  21.                     return true; 
  22.             } 
  23.             return false; 
  24.         } 


Спасибо за ваш ответ, я попробую этот способ, но мне как учащемуся интересно до ума довести и мой подход.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 июл 2016, 16:44 

Зарегистрирован: 08 окт 2015, 17:48
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Sergey777, вот цитирую вас : "Тогда, в Вашем случае, если чёрный квадратик сделать как View-элемент то можно отслеживать координаты этого элемента либо когда вызывается startDrag() (ACTION_DRAG_STARTED через методы getX()и getY()), либо когда перетаскивание заканчивается внутри границ компонента где будет находиться квадратик (View-элемент) "

Я так понимаю, что вы решили, что мне надо двигать этот черный квадратик. Но этот квадратик не должен двигаться. этот квадратик должен стать областью, где происходит "слушание", отлавливание координат пальца.
В OnTouchListener я не смог область слушателя ограничить . вот ищу способы как ограничить её.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 июл 2016, 18:39 

Зарегистрирован: 08 окт 2015, 17:48
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
может мне этот черный квадрат сделать как View и повесить на него OnTouchlistener ? только я пока нигде не могу найти того, как правильно его повесить на ImageView

Вот повесил я на ImageView OnTouchListener. допустим ImageView это квадратик посреди экрана. Вот нажав на этот квадратик и начав движение начинаю получать координаты от Action_Move. Но как я покидаю область этого квадратика, на котором весит слушатель, координаты не перестают изменяться. Но ведь я уже вне области слушателя, почему они изменяются(( ? и наоборот нажал я на области вне слушателя и не отпуская палец переношу в область слушателя и в результате координаты не начинают изменяться, о хочется чтоб он понимал, что я вновь в области слушателя. Ну и вопрос в том как такое реализовать.

с onDraglistner пока не разобрался , какие он возможности дает. нужно подробное описание . то как вы объяснили про компоненты я не совсем пока понял.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 июл 2016, 15:57 

Зарегистрирован: 30 мар 2015, 17:16
Сообщений: 68
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Turalllb писал(а):
может мне этот черный квадрат сделать как View и повесить на него OnTouchlistener ? только я пока нигде не могу найти того, как правильно его повесить на ImageView

Вот повесил я на ImageView OnTouchListener. допустим ImageView это квадратик посреди экрана. Вот нажав на этот квадратик и начав движение начинаю получать координаты от Action_Move. Но как я покидаю область этого квадратика, на котором весит слушатель, координаты не перестают изменяться. Но ведь я уже вне области слушателя, почему они изменяются(( ? и наоборот нажал я на области вне слушателя и не отпуская палец переношу в область слушателя и в результате координаты не начинают изменяться, о хочется чтоб он понимал, что я вновь в области слушателя. Ну и вопрос в том как такое реализовать.

с onDraglistner пока не разобрался , какие он возможности дает. нужно подробное описание . то как вы объяснили про компоненты я не совсем пока понял.

Здравствуйте! Я не совсем понимаю в чём именно у Вас возникла проблема? Что означает фраза: я уже вне области слушателя? У слушателя OnTouchListener нет никаких областей слушателя, он занимается только обработкой касания. И у него есть события, которые он прослушивает: нажатие, движение, отпускание и другие. Вы повесили на ImageView слушатель OnTouchListener. Теперь он отлавливает события, например его перемещения ACTION_MOVE. И пока это событие будет происходить с ImageView (вы будете перемещать ImageView), либо Вы не отмените это событие (ACTION_CANCEL), вы будете получать координаты перемещения этого View (при условии использования методов getX(), getY() события ACTION_MOVE). В этом случае для ограничения нужно всего лишь сделать проверку внутри события ACTION_MOVE слушателя OnTouchListener. Если getX() превысит или станет меньше какого-то значения, то что там нужно сделать)) Тоже самое относиться к getY(). Почитайте документацию от гугла:
https://developer.android.com/reference/android/view/MotionEvent.html
Или хотя бы напишите более точно чего Вы хотите в итоге получить.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 07 июл 2016, 22:55 

Зарегистрирован: 08 окт 2015, 17:48
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Ну в общем разбираясь в этом вопросе я дошел до сути моей проблемы и сейчас могу ее описать. Да я сделал так как тут написано "Если getX() превысит или станет меньше какого-то значения, то что там нужно сделать" а именно я задал внизу экрана диапазон координат образующий квадрат и при попадании туда пальца происходит чтот то. Что именно сейчас скажу, сперва о том что мне требуется. На экране иконка .первое касание событие down берется как точка отсчета и далее при движении пальца я получаю координаты и из них отнимаю координаты точки отсчета(первого касания) и эту разницу прибавляю к координатам иконки и перерисовываю ее. В результате я двигаю иконку непосредственно на нее не нажимая, а нажимая в ограниченной области. Но беда вот в чем. Если я нажал в этой области первое касание берется как точка от которой считается разница, не отрывая палец я выхожу из области ограниченной координатами , пока всё хорошо и как я вышел из области иконка перестает получать новые координаты , но как я возвращаюсь в эту области так же не отрывая палец то первая координата в этой области не берется как точка отсчета( не могу это реализовать), точкой отсчета остается все то же первое касание . Координата иконки = координата иконки +(getX() - первое касание) мне нужно чтобы при возвращении пальца в эту область в событии Move из getX можно было отнять первую координату (координата входа в эту область) . То есть как то надо в событии Move первую координату сохранять в переменной и их нее вычитывать вторую и последующие. Но я никак не могу в одном событии написать такой алгоритм который первую координату запомнит и из нее будет вычитывать следующие. Так как в событии я координаты могу получить только с помощью getX которое всегда текущая координата. Короче было большим заблуждением что на словах это будет проще объяснить. Хотел как проще чтобы не пришлось никому в код вчитываться, но я усложнил) как доберусь до компа пришлю код и всё станет ясно


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 июл 2016, 15:43 

Зарегистрирован: 08 окт 2015, 17:48
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Код: [ Загрузить ] [ Скрыть ]
  1. public class MainActivity1 extends Activity  { 
  2.  
  3.    public static float touchX = 50,touchY= 50; 
  4.     private float korX = touchX, korY = touchY, initX=0, initY=0, XX = 0, YY = 0; 
  5.     static int width; 
  6.     static int heigth; 
  7.  
  8.  
  9.     @Override 
  10.     protected void onCreate(Bundle savedInstanceState) { 
  11.         super.onCreate(savedInstanceState); 
  12.          GraphicsView myview = new GraphicsView(this);  
  13.         setContentView(myview);  
  14.         display(); 
  15.  
  16.     } 
  17.  
  18.     public void display(){ 
  19.          width = getWindowManager().getDefaultDisplay().getWidth(); 
  20.          heigth = getWindowManager().getDefaultDisplay().getHeight(); 
  21.         return; 
  22.     } 
  23.     public class GraphicsView extends SurfaceView implements SurfaceHolder.Callback { 
  24.  
  25.  
  26.         private DrawThread drawThread; 
  27.  
  28.         public GraphicsView(Context context) { 
  29.             super(context); 
  30.             getHolder().addCallback(this); 
  31.         } 
  32.  
  33.         @Override 
  34.         public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
  35.  
  36.         } 
  37.  
  38.         @Override 
  39.         public void surfaceCreated(SurfaceHolder holder) { 
  40.             drawThread = new DrawThread(getHolder(), getResources()); 
  41.             drawThread.setRunning(true); 
  42.             drawThread.start(); 
  43.         } 
  44.  
  45.         @Override 
  46.         public void surfaceDestroyed(SurfaceHolder holder) { 
  47.             boolean retry = true; 
  48.             drawThread.setRunning(false); 
  49.             while (retry) { 
  50.                 try { 
  51.                     drawThread.join(); 
  52.                     retry = false; 
  53.                 } catch (InterruptedException e) { 
  54.  
  55.                 } 
  56.             } 
  57.         } 
  58.  
  59.  
  60.         public boolean onTouchEvent(MotionEvent event) { 
  61.  
  62.             switch (event.getAction()) { 
  63.                 case MotionEvent.ACTION_DOWN: 
  64.  
  65.                     korX = touchX; 
  66.                     korY = touchY; 
  67.  
  68.                     if((event.getRawY()> heigth*0.827) && (event.getRawX() > width * 0.2291) && event.getRawX() < width *0.7701 ) { 
  69.  
  70.                         initX = event.getRawX(); 
  71.                         initY = event.getRawY(); 
  72.  
  73.                     } 
  74.  
  75.                     return true; 
  76.                 case MotionEvent.ACTION_MOVE: 
  77.  
  78.  
  79.  
  80.                     if((event.getRawY()> heigth*0.827) && (event.getRawX() > width * 0.2291) && event.getRawX() < width *0.7701 ){ 
  81.  
  82.                          touchX = (korX + (event.getRawX()- initX)); 
  83.                          touchY = (korY + (event.getRawY() - initY)); 
  84.  
  85.                      } 
  86.  
  87.                     // getHolder().addCallback(this); 
  88.                     return true; 
  89.             } 
  90.             return false; 
  91.         } 


ну и второй поток
Код: [ Загрузить ] [ Скрыть ]
  1. public class DrawThread extends Thread { 
  2.  
  3.     private boolean running = false; 
  4.     private SurfaceHolder surfaceHolder; 
  5.     private Matrix matrix; 
  6.     private long prevTime; 
  7.  
  8.     public Bitmap bitmap; 
  9.  
  10.     public DrawThread(SurfaceHolder surfaceHolder,Resources resources){ 
  11.         this.surfaceHolder = surfaceHolder; 
  12.           bitmap = BitmapFactory.decodeResource(resources, R.drawable.face_box); 
  13.     } 
  14.  
  15.     public  void  setRunning(boolean running){ 
  16.         this.running = running;                  
  17.     } 
  18.  
  19.     @Override 
  20.     public  void  run(){ 
  21.  
  22.         while (running){ 
  23.             Canvas canvas = null; 
  24.             
  25.  
  26.  
  27.             try { 
  28.                 canvas = surfaceHolder.lockCanvas(null); 
  29.                 if (canvas == null) 
  30.                     continue; 
  31.               synchronized (surfaceHolder) { 
  32.                   
  33.                   canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
  34.                     onDraw(canvas); 
  35.  
  36.               } 
  37.  
  38.             } finally { 
  39.                 if (canvas != null){ 
  40.                     surfaceHolder.unlockCanvasAndPost(canvas); 
  41.                 } 
  42.             } 
  43.         } 
  44.     } 
  45.  
  46.  
  47.     protected void onDraw(Canvas canvas) { 
  48.  
  49.         canvas.drawBitmap(bitmap, MainActivity1.touchX, MainActivity1.touchY, null); 
  50.     } 
  51.  
  52.  

Проще всего конечно, если бы вы запустили это у себя и в эмуляторе увидели все косяки алгоритма сами.
Я повторюсь, опираясь на переменные тут использованные. в условии в ACTION_MOVE: и вообще в алгоритме не учтен тот случай , когда палец непрерывно выходит из из области ограниченной координатами и вновь так же неотрывно входит туда. Получается что initX (точка прикосновения к экрану от которой считается разница между этой точкой и текущей координатой) не изменяется . А требуется чтобы при входе в область ограниченной координатами первая координата стала этим initX , а следующие уже будут относительно неё считать расстояние на которое требуется сместить саму иконку .

я не могу никак тут алгоритм написать , чтобы такое можно было сделать. нужно использовать еще какие нибудь методы или гестуредетектор как нибудь задействовать или в историю как то записывать касания. я хз...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 июл 2016, 18:38 

Зарегистрирован: 08 окт 2015, 17:48
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
УРа!!!оказалось алгоритм не верный . на свежую голову случайно пришла мысль как это сделать . Sergey777 , спасибо за ваши объяснения!

изначально флаг True.
Код: [ Загрузить ] [ Скрыть ]
  1. public boolean onTouchEvent(MotionEvent event) { 
  2.  
  3.             switch (event.getAction()) { 
  4.                 case MotionEvent.ACTION_DOWN: 
  5.                     korX = touchX; 
  6.                     korY = touchY; 
  7.                     initX = event.getRawX(); 
  8.                     initY = event.getRawY(); 
  9.  
  10.  
  11.                     return true; 
  12.                 case MotionEvent.ACTION_MOVE: 
  13.  
  14.                     if((event.getRawY()> heigth*0.827) && (event.getRawX() > width * 0.2291) && event.getRawX() < width *0.7701 ){ 
  15.                         if (flag) { 
  16.                             korX = touchX; 
  17.                             korY = touchY; 
  18.                             initX = event.getRawX(); 
  19.                             initY = event.getRawY(); 
  20.                             flag = false; 
  21.                         } 
  22.                         else { 
  23.                             touchX = (korX + (event.getRawX() - initX)); 
  24.                             touchY = (korY + (event.getRawY() - initY)); 
  25.                         } 
  26.  
  27.                      } 
  28.                     else { 
  29.                         flag = true; 
  30.  
  31.                     } 
  32.  
  33.                     // getHolder().addCallback(this); 
  34.                     return true; 
  35.             } 
  36.             return false; 
  37.         } 


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB