۱۳۹۳/۱۱/۲۴, ۰۷:۲۹ ق.ظ
سلام و خسته نباشید خدمت شما مدیر گرامی .
من توی یه برنامه کمیک که ساختم از کد زیر استفاده کردم (برای جابجایی در بین صفحات) و برای هر سابجکت از کد زیر
حالا مشکل من اینکه برنامه دارای حساسیت خوبی به تاچ نیست یعنی صفحه رو یه جورایی به زور عوض می کنه.
حالا سوال اولم اینکه مشکل من کجاست؟
سوال دوم هم اینکه آیا کلاسی بهتر و کاربردی تر از این هم وجود داره تا مثل یه گالری کار کنه با قابلیت زوم و عوض کردن تصویر؟
ممنون میشم راهنماییم کنید
من توی یه برنامه کمیک که ساختم از کد زیر استفاده کردم (برای جابجایی در بین صفحات)
کد پیاچپی:
import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
public class SimpleGestureFilter extends SimpleOnGestureListener{
public final static int SWIPE_UP = 1;
public final static int SWIPE_DOWN = 2;
public final static int SWIPE_LEFT = 3;
public final static int SWIPE_RIGHT = 4;
public final static int MODE_TRANSPARENT = 0;
public final static int MODE_SOLID = 1;
public final static int MODE_DYNAMIC = 2;
private final static int ACTION_FAKE = -13; //just an unlikely number
private int swipe_Min_Distance = 400;
private int swipe_Max_Distance = 800;
private int swipe_Min_Velocity = 30;
private int mode = MODE_DYNAMIC;
private boolean running = true;
private boolean tapIndicator = false;
private Activity context;
private GestureDetector detector;
private SimpleGestureListener listener;
public SimpleGestureFilter(Activity context,SimpleGestureListener sgl) {
this.context = context;
this.detector = new GestureDetector(context, this);
this.listener = sgl;
}
public void onTouchEvent(MotionEvent event){
if(!this.running)
return;
boolean result = this.detector.onTouchEvent(event);
if(this.mode == MODE_SOLID)
event.setAction(MotionEvent.ACTION_CANCEL);
else if (this.mode == MODE_DYNAMIC) {
if(event.getAction() == ACTION_FAKE)
event.setAction(MotionEvent.ACTION_UP);
else if (result)
event.setAction(MotionEvent.ACTION_CANCEL);
else if(this.tapIndicator){
event.setAction(MotionEvent.ACTION_DOWN);
this.tapIndicator = false;
}
}
//else just do nothing, it's Transparent
}
public void setMode(int m){
this.mode = m;
}
public int getMode(){
return this.mode;
}
public void setEnabled(boolean status){
this.running = status;
}
public void setSwipeMaxDistance(int distance){
this.swipe_Max_Distance = distance;
}
public void setSwipeMinDistance(int distance){
this.swipe_Min_Distance = distance;
}
public void setSwipeMinVelocity(int distance){
this.swipe_Min_Velocity = distance;
}
public int getSwipeMaxDistance(){
return this.swipe_Max_Distance;
}
public int getSwipeMinDistance(){
return this.swipe_Min_Distance;
}
public int getSwipeMinVelocity(){
return this.swipe_Min_Velocity;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
final float xDistance = Math.abs(e1.getX() - e2.getX());
final float yDistance = Math.abs(e1.getY() - e2.getY());
if(xDistance > this.swipe_Max_Distance || yDistance > this.swipe_Max_Distance)
return false;
velocityX = Math.abs(velocityX);
velocityY = Math.abs(velocityY);
boolean result = false;
if(velocityX > this.swipe_Min_Velocity && xDistance > this.swipe_Min_Distance){
if(e1.getX() > e2.getX()) // right to left
this.listener.onSwipe(SWIPE_LEFT);
else
this.listener.onSwipe(SWIPE_RIGHT);
result = true;
}
else if(velocityY > this.swipe_Min_Velocity && yDistance > this.swipe_Min_Distance){
if(e1.getY() > e2.getY()) // bottom to up
this.listener.onSwipe(SWIPE_UP);
else
this.listener.onSwipe(SWIPE_DOWN);
result = true;
}
return result;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
this.tapIndicator = true;
return false;
}
@Override
public boolean onDoubleTap(MotionEvent arg) {
this.listener.onDoubleTap();;
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent arg) {
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent arg) {
if(this.mode == MODE_DYNAMIC){ // we owe an ACTION_UP, so we fake an
arg.setAction(ACTION_FAKE); //action which will be converted to an ACTION_UP later.
this.context.dispatchTouchEvent(arg);
}
return false;
}
static interface SimpleGestureListener{
void onSwipe(int direction);
void onDoubleTap();
}
}
کد پیاچپی:
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import ir.rose_soft.feng_shen_ji_001.SimpleGestureFilter.SimpleGestureListener;
import android.net.Uri;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class Subject_1 extends Activity implements SimpleGestureListener{
private SimpleGestureFilter detector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//---hides the title bar---
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.manga_storys);
SharedPreferences shp = getSharedPreferences("sett", MODE_PRIVATE);
boolean chbt = shp.getBoolean("chk", true);
if (chbt)
getWindow()
.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// safhe
// ra
// rushan
// negah
// midarad
TouchImageView img = (TouchImageView) findViewById(R.id.touchImageView);
img.setImageResource(R.drawable.p001);
img.setMaxZoom(4f);
// Detect touched area
detector = new SimpleGestureFilter(this,this);
}
@Override
public boolean dispatchTouchEvent(MotionEvent me){
// Call onTouchEvent of SimpleGestureFilter class
this.detector.onTouchEvent(me);
return super.dispatchTouchEvent(me);
}
@Override
public void onSwipe(int direction) {
String str = "";
switch (direction) {
case SimpleGestureFilter.SWIPE_RIGHT : str = "شما در صفحه ی اول هستید (^_^)";
break;
case SimpleGestureFilter.SWIPE_LEFT : str = "2/46";
startActivity(new Intent(Subject_1.this,Subject_2.class));
finish();
break;
case SimpleGestureFilter.SWIPE_DOWN : str = "با دو انگشت به اطراف بکشید";
break;
case SimpleGestureFilter.SWIPE_UP : str = "با دو انگشت به اطراف بکشید";
break;
}
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
@Override
public void onDoubleTap() {
Toast.makeText(getApplicationContext(), "با دو انگشت به اطراف بکشید", Toast.LENGTH_SHORT).show();
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
AlertDialog ad = new AlertDialog.Builder(Subject_1.this)
.create();
ad.setTitle(" توجه ");
ad.setMessage(" می خواهید برگردید ؟ ");
ad.setButton("خیر", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
/****************/
/***************/
}
});
ad.setButton2("بله",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
/****************/
// TODO Auto-generated method stub
int RESULT_CLOSE_ALL = 0;
setResult(RESULT_CLOSE_ALL);
finish();
/***************/
}
});
ad.show();
}
}
حالا مشکل من اینکه برنامه دارای حساسیت خوبی به تاچ نیست یعنی صفحه رو یه جورایی به زور عوض می کنه.
حالا سوال اولم اینکه مشکل من کجاست؟
سوال دوم هم اینکه آیا کلاسی بهتر و کاربردی تر از این هم وجود داره تا مثل یه گالری کار کنه با قابلیت زوم و عوض کردن تصویر؟
ممنون میشم راهنماییم کنید