0
画面上で指で触れる場所から画像を移動するときに問題があります。それは私がそれに触れるとき、ボタンの中心で言えばそれを動かすことを意味する、それは私がボタンの上隅を残して、そしてその点から、それを周り、上、左、右およびように...私は、ユーザーがボタンImageView onTouchが正しく動かない
コードの上に指を入れてどこからでもボタンを移動する可能性がしたい:
public class Joystick extends RelativeLayout implements View.OnTouchListener {
private Context context;
private ImageView backgroundImageView;
private ImageView buttonImageView;
float xx = 0;
float yy = 0;
private static final String TRANSLATIONX = "setTranslationX";
public Joystick(Context context) {
super(context);
this.context = context;
initSlider();
if(buttonImageView != null) {
buttonImageView.setOnTouchListener(this);
}
this.setClipChildren(false);
}
public ImageView setView (String imageName) {
ImageView image = new ImageView(context);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
image.setLayoutParams(layoutParams);
// load image
try {
// get input stream
InputStream ims = getContext().getAssets().open(imageName);
// load image as Drawable
Drawable d = Drawable.createFromStream(ims, null);
// set image to ImageView
image.setImageDrawable(d);
} catch (IOException ex) {
}
return image;
}
public void initSlider() {
backgroundImageView = setView("background.png");
buttonImageView = setView("jostick.png");
addView(backgroundImageView);
addView(buttonImageView);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
float x = motionEvent.getRawX();
float y = motionEvent.getRawY();
float cx = buttonImageView.getWidth()/2.f;
float cy = buttonImageView.getHeight()/2.f;
float w = backgroundImageView.getWidth();
float h = backgroundImageView.getHeight();
double r = cx/2.;
double dx = x - cx;
double dy = y - cy;
double hypot = Math.hypot(dx, dy);
double cos = dx/hypot; // cos
double sin = dy/hypot; // sin
double rcos = r * cos;
double rsin = r * sin;
double rdx = Math.abs(dx) < Math.abs(rcos) ? dx : rcos; // if,else
double rdy = Math.abs(dy) < Math.abs(rsin) ? dy : rsin;
Log.d("VALUES", "RAW X:" + motionEvent.getRawX() + ", X:" + motionEvent.getX() + ", CX:" + cx + ", CY:" + cy + ", dx:" + dx + ", dy:" + dy + ", Hypo:" + hypot + ", cos:" + cos + ", sin" + sin);
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
view.setX(xx);
view.setY(yy);
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
float transX = (float) (cx + rdx - w/2.);
float transY = (float) (cy + rdy - h/2.);
buttonImageView.setTranslationX(transX);
buttonImageView.setTranslationY(transY);
Log.d(TRANSLATIONX,"X:" + transX + ", Y:" + transY);
break;
}
return true;
}
}
どこかの小さなバグです。私はどんな助けも願っています。誰もが興味を持ったりJoystick Button
がボックス内に移動するようにする方法をいくつかの答えを探している場合おかげ
'rdx' /' rdy'には何が必要ですか? – pskink
トップボタン(buttonImageView)をサークルボトム(backgroundImageView)の外側に移動しないように設定します。制約のように。もっと良い解決策はありますか? –
view.setX(xx)のように私に見えます;とview.setY(yy); xx &&yyが両方とも0であるため、ビューを左上に移動しています。 –