簡単なものが欲しいだけです。 imageview
があり、タッチで移動できます
これは私のコードです。自分で試しただけなので、間違っていたらごめんなさい
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
status = StartDrag;
} else if (arg1.getAction() == MotionEvent.ACTION_UP) {
status = StopDrag;
}
return false;
}
});
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (status == StartDrag) {
params.leftMargin = (int) event.getX();
params.topMargin = (int) event.getY();
img.setLayoutParams(params);
}
return super.onTouchEvent(event);
}
正しい方法を教えていただけますか?
ビューをドラッグするためのonTouch
イベントは、RelativeLayout
およびFrameLayout
の子ビューに最適です。
次に例を示します。
_@Override
public boolean onTouch(View v, MotionEvent event){
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN :
{
x = event.getX();
y = event.getY();
dx = x-myView.getX();
dy = y-myView.getY();
}
break;
case MotionEvent.ACTION_MOVE :
{
myView.setX(event.getX()-dx);
myView.setY(event.getY()-dy);
}
break;
case MotionEvent.ACTION_UP :
{
//your stuff
}
return true;
}
_
dx
とdy
が行うことは、_ACTION_DOWN
_で、ビューのどこに触れたかを記録し、ビューの左(x)と上(y)からの差を取得することです。 、_ACTION_MOVE
_中にこれらのマージンを維持するため。
タッチイベントに参加する場合は、true
である必要があります。
更新:API 8の場合
API 8の場合、getX()
メソッドとgetY()
メソッドは正しい結果を提供しないため、使用できるのはgetRawX()
とgetRawY()
です。メソッド。
例:
_RelativeLayout.LayoutParams parms;
LinearLayout.LayoutParams par;
float dx=0,dy=0,x=0,y=0;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN :
{
parms = (LayoutParams) myView.getLayoutParams();
par = (LinearLayout.LayoutParams) getWindow().findViewById(Window.ID_Android_CONTENT).getLayoutParams();
dx = event.getRawX() - parms.leftMargin;
dy = event.getRawY() - parms.topMargin;
}
break;
case MotionEvent.ACTION_MOVE :
{
x = event.getRawX();
y = event.getRawY();
parms.leftMargin = (int) (x-dx);
parms.topMargin = (int) (y - dy);
myView.setLayoutParams(parms);
}
break;
case MotionEvent.ACTION_UP :
{
}
break;
}
return true;
}
_
私はこのようにしました:
private float xCoOrdinate, yCoOrdinate;
onCreate():
ImageView imageView = (ImageView)findViewById(R.id.imageView);
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
xCoOrdinate = view.getX() - event.getRawX();
yCoOrdinate = view.getY() - event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
view.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start();
break;
default:
return false;
}
return true;
}
});
完了
私は同じ問題を抱えていて、なんとか問題を解決することができました。つまり、ズームインとズームアウトに加えて、画面上で画像をドラッグし、フレームレイアウトで画像を回転させますAndroidプログラムで。このブログ投稿からこのソースコードを試してください。
次のコードを使用すると、ビューをドラッグして移動できます。
import Android.view.*;
import Android.view.View.*;
public class DragMove<T extends View> implements OnTouchListener
{
private final T view;
private int leftOffset;
private int topOffset;
public DragMove(T dragable)
{
this.view = dragable;
this.view.setOnTouchListener(this);
}
@Override
public boolean onTouch(View p1, MotionEvent event)
{
/*
public static int pxFromDp(double dp, View v)
{
Activity context = (Activity)v.getContext();
return pxFromDp(dp, context);
}
public static int pxFromDp(double dp, Activity context)
{
float logicalDensity = getDensity(context);
int px = (int) Math.round(dp * logicalDensity);
return px;
}
*/
int x = GuiUtils.pxFromDp(event.getRawX(), view);
int y = GuiUtils.pxFromDp(event.getRawY(), view);
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN :
{
// calculates offset to current coordinate,
// keeps position relative (from jumping) during move
ViewGroup.LayoutParams parms = view.getLayoutParams();
// e.g. = x - params.leftMargin
leftOffset = x - Layout.readLeftMargin(parms);
topOffset = y - Layout.readTopMargin(parms);
}
return true;
case MotionEvent.ACTION_MOVE :
{
// adjust by touch position retaining touch
// offset at start
ViewGroup.LayoutParams parms = view.getLayoutParams();
// e.g params.leftMargin = x - leftOffset
Layout.writeLeftMargin(parms, x - leftOffset);
Layout.writeTopMargin(parms, y - topOffset);
view.setLayoutParams(parms);
}
return true;
}
return false;
}
}
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
StickerRelativeLayout = (RelativeLayout) findViewById(R.id.shsticker_relativeLayout1);
RelativeLayout.LayoutParams layoutParams;
layoutParams = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
final ImageView view = new ImageView(getApplicationContext());
view.setPadding(10, 10, 10, 10);
view.setImageResource(shstickerBaseAdaptor.shstickerImage[arg2]);
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
windowwidth = getWindowManager().getDefaultDisplay()
.getWidth();
windowheight = getWindowManager().getDefaultDisplay()
.getHeight();
Android.widget.RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(ImageEditingClass.this,
"hii rma jee", Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
int x_cord = (int) event.getRawX();
int y_cord = (int) event.getRawY();
if (x_cord > windowwidth) {
x_cord = windowwidth;
}
if (y_cord > windowheight) {
y_cord = windowheight;
}
layoutParams.leftMargin = x_cord - 15;
layoutParams.topMargin = y_cord -100;
layoutParams.rightMargin = x_cord - 50;
layoutParams.bottomMargin = x_cord - 50;
view.setLayoutParams(layoutParams);
break;
default:
break;
}
return true;
}
});
// setText(++ViewGenerate + " hii this new");
StickerRelativeLayout.addView(view, layoutParams);
// }
Toast.makeText(ImageEditingClass.this, "you click" + arg2,
Toast.LENGTH_SHORT).show();
}
画像を任意の方向に移動したい場合は、次の手順に従う必要があります-1 float dx = 0、dy = 0、x = 0、y = 0、z = 0、w = 0 、dz = 0、dw = 0; {これらのあなたは4つの座標}
public void StickerPopulate(){
LinerLayoutInfate.removeAllViews();
shstickerBaseAdaptor = new ShstickerBaseAdaptor(getApplicationContext());
View shstickerView = getLayoutInflater().inflate(R.layout.shareimage,
null);
Gallery shsticker_gallery = (Gallery) shstickerView
.findViewById(R.id.shsticker_gallery);
shsticker_gallery.setAdapter(new ShstickerBaseAdaptor(
ImageEditingClass.this));
shsticker_gallery.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
StickerRelativeLayout = (RelativeLayout) findViewById(R.id.shsticker_relativeLayout1);
RelativeLayout.LayoutParams layoutParams;
layoutParams = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
final ImageView crossBtn = new ImageView(
getApplicationContext());
crossBtn.setBackgroundResource(R.drawable.cross);
crossBtn.setMaxWidth(300);
crossBtn.setMaxHeight(200);
crossBtn.setPadding(10, 10, 10, 10);
final ImageView view = new ImageView(getApplicationContext());
view.setImageResource(shstickerBaseAdaptor.shstickerImage[arg2]);
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
windowwidth = getWindowManager().getDefaultDisplay()
.getWidth();
windowheight = getWindowManager().getDefaultDisplay()
.getHeight();
Android.widget.RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
dx = event.getRawX() - layoutParams.leftMargin;
dy = event.getRawY() - layoutParams.topMargin;
dz = event.getRawX() - layoutParams.bottomMargin;
dw = event.getRawX() - layoutParams.rightMargin;
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
x = event.getRawX();
y = event.getRawY();
layoutParams.leftMargin = (int) (x - dx);
layoutParams.topMargin = (int) (y - dy);
layoutParams.bottomMargin = (int) (z - dz);
layoutParams.rightMargin = (int) (w - dw);
view.setLayoutParams(layoutParams);
break;
default:
break;
}
return true;
}
});
StickerRelativeLayout.addView(crossBtn, layoutParams);
StickerRelativeLayout.addView(view, layoutParams);
// }
Toast.makeText(ImageEditingClass.this, "you click" + arg2,
Toast.LENGTH_SHORT).show();
}
});
LinerLayoutInfate.addView(shstickerView);
}