PDA

View Full Version : نحوه کار با touch



meysam jahedi
جمعه 30 آبان 1393, 19:57 عصر
سلام

با کد زیر وقتی از چپ به راست صفحه گوشی رو لمس میکنیم پیام toast اجرا میشه ، حالا چطور از سمت راست به چپ رو انجام بدیم؟



View touchview=findViewById(R.id.matn_layout);
touchview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
start=(int) event.getRawX();

}
if (event.getAction()==MotionEvent.ACTION_UP) {
end=(int) event.getRawX();
if (end-start>100) {
Toast.makeText(getApplicationContext(),"سمت چپ به راست لمس شد ", Toast.LENGTH_SHORT).show();

}

}
return true;
}
});

Amin-rz
جمعه 30 آبان 1393, 20:08 عصر
if ( start - end ) > 100

meysam jahedi
جمعه 30 آبان 1393, 20:18 عصر
if ( start - end ) > 100

نه ، اتفاقی نیفتاد

meysam jahedi
جمعه 30 آبان 1393, 20:38 عصر
دوستان کسی نظری نداره

dalmif
جمعه 30 آبان 1393, 20:45 عصر
جاهای ACTION_UP رو با ACTION_DOWN عوض کنید

meysam jahedi
جمعه 30 آبان 1393, 20:54 عصر
جاهای ACTION_UP رو با ACTION_DOWN عوض کنید

نه عزیزم (همچین چیزی :متفکر: نمیشه)

meysam jahedi
جمعه 30 آبان 1393, 21:32 عصر
این دستورات هم از http://stackoverflow.com/questions/6344133/how-to-control-ontouch-functionality-in-android

گرفتم اما بازم از به چپ جواب نمیده :(toast دوم جواب نمیده)
View touch=findViewById(R.id.matn_layout);
touch.setOnTouchListener(new OnTouchListener() {

public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction())
{
case MotionEvent.ACTION_DOWN:
{
// store the X value when the user's finger was pressed down
downXValue = arg1.getX();
break;
}

case MotionEvent.ACTION_UP:
{
// Get the X value when the user released his/her finger
float currentX = arg1.getX();

// going backwards: pushing stuff to the right
if (downXValue < currentX)
{
Toast.makeText(getApplicationContext(), "به راست", Toast.LENGTH_SHORT).show();
}

// going forwards: pushing stuff to the left
if (downXValue > currentX)
{
// Get a reference to the ViewFlipper
Toast.makeText(getApplicationContext(), "به چپ", Toast.LENGTH_SHORT).show();
}
break;
}
}
return true;
}

});

dalmif
جمعه 30 آبان 1393, 21:35 عصر
اتفاقا من از یه سایتی دیدم که از بالا به پایین و بلعکس و راست به چپ و بلعکس رو داشت.
امتحانم کردم و کاملا سالم بود.
حالا هرچی دنبالش میگردم پیداش نمیکنم.:گریه::گریه::گریه:

tux-world
جمعه 30 آبان 1393, 21:45 عصر
خوب اینو تست کن.

import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListen er;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class OnSwipeTouchListener implements OnTouchListener {

private final GestureDetector gestureDetector;

public OnSwipeTouchListener (Context ctx){
gestureDetector = new GestureDetector(ctx, new GestureListener());
}

private final class GestureListener extends SimpleOnGestureListener {

private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;

@Override
public boolean onDown(MotionEvent e) {
return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight();
} else {
onSwipeLeft();
}
}
result = true;
}
else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
}
result = true;

} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}

public void onSwipeRight() {
}

public void onSwipeLeft() {
}

public void onSwipeTop() {
}

public void onSwipeBottom() {
}
}

طریقه استفاده:

imageView.setOnTouchListener(new OnSwipeTouchListener() {
public void onSwipeTop() {
Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
}
public void onSwipeRight() {
Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show();
}
public void onSwipeLeft() {
Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show();
}
public void onSwipeBottom() {
Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show();
}

public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});

meysam jahedi
جمعه 30 آبان 1393, 22:03 عصر
راستش اصلا سردر نمیارم

meysam jahedi
جمعه 30 آبان 1393, 22:33 عصر
نحوه استفاده از این دستورات چجوریه ؟
public boolean onTouchEvent(MotionEvent touchevent)
{
switch (touchevent.getAction())
{
// when user first touches the screen we get x and y coordinate
case MotionEvent.ACTION_DOWN:
{
x1 = touchevent.getX();
y1 = touchevent.getY();
break;
}
case MotionEvent.ACTION_UP:
{
x2 = touchevent.getX();
y2 = touchevent.getY();

/ /if left to right sweep event on screen
if (x1 < x2)
{
Toast.makeText(this, "Left to Right Swap Performed", Toast.LENGTH_LONG).show();
}

// if right to left sweep event on screen
if (x1 > x2)
{
Toast.makeText(this, "Right to Left Swap Performed", Toast.LENGTH_LONG).show();
}

// if UP to Down sweep event on screen
if (y1 < y2)
{
Toast.makeText(this, "UP to Down Swap Performed", Toast.LENGTH_LONG).show();
}

/ /if Down to UP sweep event on screen
if (y1 > y2)
{
Toast.makeText(this, "Down to UP Swap Performed", Toast.LENGTH_LONG).show();
}
break;
}
}
return false;
}


onTouchEvent چجوری مقدار باید داد؟

Amin-rz
جمعه 30 آبان 1393, 22:33 عصر
من اینو تست کردم و کاملا جواب داد :

View touchview=findViewById(R.id.TextViewadds);

touchview.setOnTouchListener(new OnTouchListener() {

int start;
int end;

@Override

public boolean onTouch(View arg0, MotionEvent event) {

if (event.getAction()==MotionEvent.ACTION_DOWN) {

start=(int) event.getRawX();
}

if (event.getAction()==MotionEvent.ACTION_UP) {

end=(int) event.getRawX();

if (start-end>100) {

Toast.makeText(getApplicationContext(),"سمت چپ به راست لمس شد ", Toast.LENGTH_SHORT).show();
}

}

return true;

}

});

meysam jahedi
جمعه 30 آبان 1393, 22:51 عصر
اگه end-start>100 بزاریم برا لمس از راست به چپ جواب میده اما start-end>100 کلا هیچ اتفاقی نمیفته

NeoFighT
جمعه 30 آبان 1393, 23:30 عصر
این کد 4 جهت رو جواب میده
بفرمایید:

private void WhatMove(int x1,int y1,int x2,int y2){
int distX = x2 - x1;
int distY = y2 - y1;

if(distX>100){
//right
Toast.makeText(getBaseContext(),"Right",Toast.LENGTH_SHORT).show();
}
if(distX<-100){
//left
Toast.makeText(getBaseContext(),"Left",Toast.LENGTH_SHORT).show();
}
if(distY>100){
//down
Toast.makeText(getBaseContext(),"Down",Toast.LENGTH_SHORT).show();
}
if(distY<-100){
//top
Toast.makeText(getBaseContext(),"Top",Toast.LENGTH_SHORT).show();
}
}

meysam jahedi
جمعه 30 آبان 1393, 23:42 عصر
این کد 4 جهت رو جواب میده
بفرمایید:

private void WhatMove(int x1,int y1,int x2,int y2){
int distX = x2 - x1;
int distY = y2 - y1;

if(distX>100){
//right
Toast.makeText(getBaseContext(),"Right",Toast.LENGTH_SHORT).show();
}
if(distX<-100){
//left
Toast.makeText(getBaseContext(),"Left",Toast.LENGTH_SHORT).show();
}
if(distY>100){
//down
Toast.makeText(getBaseContext(),"Down",Toast.LENGTH_SHORT).show();
}
if(distY<-100){
//top
Toast.makeText(getBaseContext(),"Top",Toast.LENGTH_SHORT).show();
}
}


کاملش رو مینوشتید ممنون میشدم

NeoFighT
شنبه 01 آذر 1393, 02:12 صبح
بفرما اینم کاملش.
فقط اگه یکمی سعی میکردین خودتونم میتونستین کاملش کنید.:چشمک:


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.widget.Toast;

public class MainActivity extends Activity {
int x1,y1,x2,y2;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN :
x1 = (int) event.getX();
y1 = (int) event.getY();
break;

case MotionEvent.ACTION_UP :
x2 = (int) event.getX();
y2 = (int) event.getY();
WhatMove(x1,y1,x2,y2);
break;
}
return super.onTouchEvent(event);
}

private void WhatMove(int x1,int y1,int x2,int y2){
int distX = x2 - x1;
int distY = y2 - y1;

if(distX>100){
//right
Toast.makeText(getBaseContext(),"Right",Toast.LENGTH_SHORT).show();
}
if(distX<-100){
//left
Toast.makeText(getBaseContext(),"Left",Toast.LENGTH_SHORT).show();
}
if(distY>100){
//down
Toast.makeText(getBaseContext(),"Down",Toast.LENGTH_SHORT).show();
}
if(distY<-100){
//top
Toast.makeText(getBaseContext(),"Top",Toast.LENGTH_SHORT).show();
}
}
}

meysam jahedi
شنبه 01 آذر 1393, 11:08 صبح
if(distY<-100){ //top
Toast.makeText(getBaseContext(),"Top",Toast.LENGTH _SHORT).show();
}


فقط این قسمت اجرا میشه

NeoFighT
شنبه 01 آذر 1393, 19:22 عصر
این رو امتحان کنید.
همین الان تست کردم جواب هم گرفتم.
(تقریبا همون کد قبلیٍ)


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;

public class MainActivity extends Activity {
Pos p1,p2;

private class Pos{
public int x,y;
public Pos(int x,int y){
this.x = x;
this.y = y;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

p1 = new Pos(0, 0);
p2 = new Pos(0, 0);
}

@Override
public boolean onTouchEvent(MotionEvent event) {


switch(event.getAction()){
case MotionEvent.ACTION_DOWN :
Log.d("SS","ACTION_DOWN");
p1.x = (int) event.getX();
p1.y = (int) event.getY();

break;

case MotionEvent.ACTION_UP :
Log.d("SS","ACTION_UP");
p2.x = (int) event.getX();
p2.y = (int) event.getY();
Log.d("SS","x1 : " + p1.x);
Log.d("SS","y1 : " + p1.y);
Log.d("SS","x2 : " + p2.x);
Log.d("SS","y2 : " + p2.y);
if(p1!=null && p2!=null)
WhatMove(p1,p2);
break;


}
return super.onTouchEvent(event);
}

private void WhatMove(Pos p1,Pos p2){
int distX = p2.x - p1.x;
int distY = p2.y - p1.y;
Log.d("SS","distX : " + distX);
Log.d("SS","distY : " + distY);

if(Math.abs(distX) > Math.abs(distY)){
//Horisontal
if(distX>100){
//right
Toast.makeText(getBaseContext(),"Right",Toast.LENGTH_SHORT).show();
}
if(distX<-100){
//left
Toast.makeText(getBaseContext(),"Left",Toast.LENGTH_SHORT).show();
}
}else{
//Vertical
if(distY>100){
//down
Toast.makeText(getBaseContext(),"Down",Toast.LENGTH_SHORT).show();
}
if(distY<-100){
//top
Toast.makeText(getBaseContext(),"Top",Toast.LENGTH_SHORT).show();
}
}
}
}

meysam jahedi
شنبه 01 آذر 1393, 20:17 عصر
عالی بود ، مرسی

راستش خط زیر رو نفهمیدم کارش چیه (سوالم خیلی ابتداییه:خجالت:)

Log.d("SS","ACTION_DOWN");

کلا Log.d ها

meysam jahedi
شنبه 01 آذر 1393, 21:12 عصر
راستش من دنبال راحی هستم که تو ساخت کتاب علاوه بر اینکه کاربر با زدن دکمه های Next و Back به صفحه های عقب و جلو بره ، بتونه با لمس صفحه گوشی به راست و چپ این کار رو انجام بده ،
آیا راهش استفاده از همین دستورات ؟
تو این دستورات هم نمیدونم چرا وقتی دستوراتم رو جایگزین toast ها میکنم فقط حالت چپ به راست برام جواب میده و میره صفحه قبل و بقیه حالت ها جواب نمیده

دستورات زیر رو میخوام جایگزین toast ها در left و right کنم

btnnext.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

if(page2==page1){
Toast.makeText(getApplicationContext(),"صفحه آخر", Toast.LENGTH_SHORT).show();
}else{
page2++;
refresh3(page2);

}

}
});
btnpre.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

if(page2==1){
Toast.makeText(getApplicationContext(),"صفحه اول", Toast.LENGTH_SHORT).show();
}else{
page2--;
refresh3(page2);

}

}
});

tux-world
شنبه 01 آذر 1393, 21:27 عصر
کدی که دادم دقیق کار میکنه. چیزی که این وسط میمونه اینه که سوالی که پرسیدی با توضیحاتی که دادی زمین تا آسمون فرق کرد. لطفا وقتی سوال میپرسی قشنگ توضیح بده بگو چی فکرته ما هم بدونیم قضیه چیه رو حدسیات که نمیشه حرف زد

NeoFighT
شنبه 01 آذر 1393, 21:29 عصر
عالی بود ، مرسی

راستش خط زیر رو نفهمیدم کارش چیه (سوالم خیلی ابتداییه:خجالت:)

Log.d("SS","ACTION_DOWN");

کلا Log.d ها

از log ها برای دیباگ کردن برنامه استفاده میشه مثلا میخوای بفهمی مشکل برنامه کجاست.
همه log هارو پاک کن من حواسم نبود پاکشون کنم.

meysam jahedi
شنبه 01 آذر 1393, 22:12 عصر
کدی که دادم دقیق کار میکنه. چیزی که این وسط میمونه اینه که سوالی که پرسیدی با توضیحاتی که دادی زمین تا آسمون فرق کرد. لطفا وقتی سوال میپرسی قشنگ توضیح بده بگو چی فکرته ما هم بدونیم قضیه چیه رو حدسیات که نمیشه حرف زد

تو کتابی که ساختم ، تو فرم نمایش متن پایینش دو تا دکمه داره که برای پس و پیش رفتن در صفحات هست و با دستورات زیر این کار انجام میشه :
btnnext.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

if(page2==page1){
Toast.makeText(getApplicationContext(),"صفحه آخر", Toast.LENGTH_SHORT).show();
}else{
page2++;
refresh3(page2);

}

}
});
btnpre.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

if(page2==1){
Toast.makeText(getApplicationContext(),"صفحه اول", Toast.LENGTH_SHORT).show();
}else{
page2--;
refresh3(page2);

}

}
});






حالا میخوام کاربر علاوه بر زدن این دو دکمه ، بتونه با لمس صفحه گوشی به چپ و راست این کار ها رو انجام بده یعنی با لمس گوشی از چپ به راست کار دکمه btnpre و لمس گوشی از راست به چپ کار دکمه btnnext انجام بشه .

دستوراتی که NeoFighT نوشتن یعنی :


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;

public class MainActivity extends Activity {
Pos p1,p2;

private class Pos{
public int x,y;
public Pos(int x,int y){
this.x = x;
this.y = y;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

p1 = new Pos(0, 0);
p2 = new Pos(0, 0);
}

@Override
public boolean onTouchEvent(MotionEvent event) {


switch(event.getAction()){
case MotionEvent.ACTION_DOWN :
Log.d("SS","ACTION_DOWN");
p1.x = (int) event.getX();
p1.y = (int) event.getY();

break;

case MotionEvent.ACTION_UP :
Log.d("SS","ACTION_UP");
p2.x = (int) event.getX();
p2.y = (int) event.getY();
Log.d("SS","x1 : " + p1.x);
Log.d("SS","y1 : " + p1.y);
Log.d("SS","x2 : " + p2.x);
Log.d("SS","y2 : " + p2.y);
if(p1!=null && p2!=null)
WhatMove(p1,p2);
break;


}
return super.onTouchEvent(event);
}

private void WhatMove(Pos p1,Pos p2){
int distX = p2.x - p1.x;
int distY = p2.y - p1.y;
Log.d("SS","distX : " + distX);
Log.d("SS","distY : " + distY);

if(Math.abs(distX) > Math.abs(distY)){
//Horisontal
if(distX>100){
//right
Toast.makeText(getBaseContext(),"Right",Toast.LENG TH_SHORT).show();
}
if(distX<-100){
//left
Toast.makeText(getBaseContext(),"Left",Toast.LENGT H_SHORT).show();
}
}else{
//Vertical
if(distY>100){
//down
Toast.makeText(getBaseContext(),"Down",Toast.LENGT H_SHORT).show();
}
if(distY<-100){
//top
Toast.makeText(getBaseContext(),"Top",Toast.LENGTH _SHORT).show();
}
}
}
}




به درستی برای TOAST ها انجام میشه و پیام LEFT , RIGHT,.. نشون داده میشه

اما نمیدونم چرا وقتی دستوراتی که در دکمه های btnNext و btnPre رو جای گزین پیام های toast میکنم فقط شرط اولی جواب میده یعنی وقتی اینجوری مینویسم:


if(distX>100){ //right
if(page2==page1){ Toast.makeText(getApplicationContext(),"صفحه آخر", Toast.LENGTH_SHORT).show();
}else{
page2++;
refresh3(page2);

}



}
if(distX<-100){
//left
if(page2==1){ Toast.makeText(getApplicationContext(),"صفحه اول", Toast.LENGTH_SHORT).show();
}else{
page2--;
refresh3(page2);

}



}






فقط قسمت اولش کار میکنه و با لمس گوشی از چپ به راست صفحه میره به صفحه قبلی اما قسمت دوم کار نمیکنه

meysam jahedi
یک شنبه 02 آذر 1393, 12:33 عصر
کسی پیشنهادی نداره؟

meysam jahedi
دوشنبه 03 آذر 1393, 11:52 صبح
یعنی کسی کتابی نمیسازه که با لمس صفحه گوشی بشه شماره صفحه داستان رو تغییر داد؟

meysam jahedi
سه شنبه 04 آذر 1393, 00:45 صبح
به جوابم هنوز نرسیدم:گریه:

NeoFighT
سه شنبه 04 آذر 1393, 00:52 صبح
اون قسمتی که مشکل داره رو کامل بزار ببینم مشکلش چیه

meysam jahedi
سه شنبه 04 آذر 1393, 01:00 صبح
اون قسمتی که مشکل داره رو کامل بزار ببینم مشکلش چیه
سلام
راستش هیچ خطایی نمیده ، فقط انجام نمیشه ، تو 3 پست قبل یعنی پست #23 ببینید کامل توضیح دادم