Как прокрутить кнопку события onTouch в android

Как прокрутить кнопку на сенсорном событии андроида с направлениями влево, вправо, вверх, вниз ..? … Я новичок в андроиде и хочу разработать обратное приложение. Пожалуйста, помогите, предоставив некоторые ссылки

callbackButton.setOnTouchListener(new OnTouchListener() { private float currX; private float currY; @Override public boolean onTouch(View v, MotionEvent event) { float x1 = 0, x2, y1 = 0, y2, dx, dy , oldx =0,oldy=0; String direction; switch(event.getAction()) { case MotionEvent.ACTION_DOWN: oldx = event.getX(); oldy = event.getY(); break; case MotionEvent.ACTION_MOVE: x2 = event.getX(); y2 = event.getY(); dx = x2-x1; dy = y2-y1; // Use dx and dy to determine the direction if(Math.abs(dx) > Math.abs(dy)) { if(dx>0) { direction = "right"; Log.e("right...","moving.."); }else{ direction = "left"; Log.e("left...","moving.."); } } else { if(dy>0) { direction = "down"; Log.e("down...","moving.."); currX = event.getRawX(); currY = event.getRawY(); Log.e("x=", ""+(currX-oldx)); Log.e("y=", ""+(currY-oldy)); MarginLayoutParams marginParams = new MarginLayoutParams(v.getLayoutParams()); marginParams.setMargins((int)(currX-oldx), (int)(currY-oldy),0, 0); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams); v.setLayoutParams(layoutParams); } else { direction = "up"; Log.e("up...","moving.."); } } } return true; } }); 

Это мой код для motionButton, который перемещается по сенсорному событию. Но этот код не работает, поскольку я хочу

Здесь вы найдете объяснение того, как обрабатывать события касания:

http://developer.android.com/guide/topics/ui/ui-events.html

Затем, в методе касания, вам нужно

  • Обнаружить, когда пользователь положил палец вниз
  • Сохранить позицию пальца
  • Обнаруживать, когда пользователь перемещается
  • Сравнить с предыдущей позицией
  • Обнаруживать, когда пользователь перестает касаться экрана

Пример (с использованием кода из http://developer.android.com/training/graphics/opengl/touch.html )

 @Override public boolean onTouchEvent(MotionEvent e) { // MotionEvent reports input details from the touch screen // and other input controls. In this case, you are only // interested in events where the touch position changed. float x = e.getX(); float y = e.getY(); switch (e.getAction()) { case MotionEvent.ACTION_DOWN: mIsDown = true; break; case MotionEvent.ACTION_MOVE: float dx = x - mPreviousX; float dy = y - mPreviousY; // Here you can try to detect the swipe. It will be necessary to // store more than the previous value to check that the user move constantly in the same direction detectSwipe(dx, dy); case MotionEvent.ACTION_UP: mIsDown = false; break; } mPreviousX = x; mPreviousY = y; return true; } 

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

Удачи с вашим приложением

РЕДАКТИРОВАТЬ:

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

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

EDIT 2: Я предполагаю, что кнопка – это простой андроид.Button. Одним из решений может быть создание класса, который расширяет Button (ex: MySwipableButton). В вашем xml вы создаете макет, содержащий ваш MySwipableButton, и даете ему достаточно места для перемещения (например, он имеет width = fill_parent, так как вы хотите, чтобы он прокручивался во время экрана). MySwipableButton реализует onTouch, чтобы сохранить позицию, в которой должна быть кнопка (с использованием метода, который у вас уже есть). MySwipableButton также перезаписывает onDraw(Graphics g) . В onDraw вы нарисуете кнопку (super.draw ()) в том месте, где она должна быть (относительно текущего салфетки), и оставите остальную часть поля пустым

Проверьте мой блог, в котором я показывал событие перетаскивания drag onTouch .

Edit : вот полный код:

Прежде всего создайте проект android в своем затмении и создайте файл класса и макета, как показано ниже:

MainActivity.java

 public class MainActivity extends Activity { private ImageView m_ivImage, m_ivImage1; private int m_counter = 0; float m_lastTouchX, m_lastTouchY, m_posX, m_posY, m_prevX, m_prevY, m_imgXB, m_imgYB, m_imgXC, m_imgYC, m_dx, m_dy; private LinearLayout m_llTop; private AbsoluteLayout m_alTop; private Button m_btnAddView, m_btnRemove; private Context m_context; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); m_context = this; m_prevX = 0; m_prevY = 0; m_imgXB = 50; m_imgYB = 100; m_imgXC = 150; m_imgYC = 100; m_ivImage = (ImageView) findViewById(R.id.ivImage); m_ivImage1 = (ImageView) findViewById(R.id.ivImage1); m_llTop = (LinearLayout) findViewById(R.id.llTop); m_alTop = (AbsoluteLayout) findViewById(R.id.alTop); m_btnAddView = (Button) findViewById(R.id.btnAdd); m_btnRemove = (Button) findViewById(R.id.btnRemove); m_ivImage.setOnTouchListener(m_onTouchListener); m_ivImage1.setOnTouchListener(m_onTouchListener); m_btnAddView.setOnClickListener(m_onClickListener); m_btnRemove.setOnClickListener(m_onClickListener); } OnClickListener m_onClickListener = new OnClickListener(){ @Override public void onClick(View p_v) { switch (p_v.getId()) { case R.id.btnAdd: addView(); break; case R.id.btnRemove: removeView(); break; default: break; } } }; OnTouchListener m_onTouchListener = new OnTouchListener(){ @Override public boolean onTouch(View p_v, MotionEvent p_event) { switch (p_event.getAction()) { case MotionEvent.ACTION_DOWN: { m_lastTouchX = p_event.getX(); m_lastTouchY = p_event.getY(); break; } case MotionEvent.ACTION_UP: { break; } case MotionEvent.ACTION_MOVE: { m_dx = p_event.getX() - m_lastTouchX; m_dy = p_event.getY() - m_lastTouchY; m_posX = m_prevX + m_dx; m_posY = m_prevY + m_dy; if (m_posX > 0 && m_posY > 0 && (m_posX + p_v.getWidth()) < m_alTop.getWidth() && (m_posY + p_v.getHeight()) < m_alTop.getHeight()) { p_v.setLayoutParams(new AbsoluteLayout.LayoutParams(p_v.getMeasuredWidth(), p_v.getMeasuredHeight(), (int) m_posX, (int) m_posY)); m_prevX = m_posX; m_prevY = m_posY; } break; } } return true; } }; /** * Add view dynamically for drag and drop */ private void addView() { ImageView m_img = new ImageView(m_context); TextView m_tv=new TextView(m_context); if (m_counter < 5) { if (m_counter % 2 == 0) { m_img.setBackgroundResource(R.drawable.bol_green); m_tv.setText("Hello! Drag Me! "); m_alTop.addView(m_tv, new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, ((int) m_imgXB), ((int) m_imgYB))); m_alTop.addView(m_img, new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, ((int) m_imgXB), ((int) m_imgYB))); } else { m_img.setBackgroundResource(R.drawable.bol_paars); m_alTop.addView(m_img, new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, ((int) m_imgXC), ((int) m_imgYC))); } m_counter++; if (m_counter == 5) m_btnAddView.setEnabled(false); } m_img.setOnTouchListener(m_onTouchListener); m_tv.setOnTouchListener(m_onTouchListener); } public void removeView() { m_counter = 0; m_alTop.removeAllViews(); m_alTop.invalidate(); m_btnAddView.setEnabled(true); } } 

main_layout.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/llTop" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <AbsoluteLayout android:id="@+id/alTop" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_margin="10dp" android:layout_weight=".70" > <ImageView android:id="@+id/ivImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:src="@drawable/ic_menu_share" android:visibility="gone" /> <ImageView android:id="@+id/ivImage1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_x="193dp" android:layout_y="29dp" android:src="@drawable/ic_launcher" /> </AbsoluteLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="0dp" android:layout_gravity="center" android:layout_weight=".30" > <Button android:id="@+id/btnAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Add View" /> <Button android:id="@+id/btnRemove" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Remove View" android:visibility="visible" /> </LinearLayout> </LinearLayout> 

Вот код XML-файла границы, который показывает границу макета, в котором перемещается объект.

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <stroke android:width="1dp" android:color="#000000"/> <corners android:topLeftRadius="8dp" android:topRightRadius="8dp" android:bottomLeftRadius="8dp" android:bottomRightRadius="8dp"/> <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp"/> <gradient android:angle="270" android:endColor="#FFFFFF" android:startColor="#FFFFFF" android:type="linear" android:centerColor="#FFFFFF"/> </shape> </item> </selector>