与触摸事件移动imageview的
我只想要一个简单的事情 我哈瓦一个imageview的,我可以用触摸与触摸事件移动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);
}
你能告诉我正确的方法吗?感谢:D
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;
}
setX是API 15上的方法吗?我在这里使用API 8 .. – 2013-02-12 04:00:59
是的,所以你必须在旧的API上以不同的方式执行,检查更新后的例子 – 2013-02-12 19:41:40
btw我有一个quetion ,触摸和ontouchevent有什么不同? – 2013-02-15 17:03:19
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 浮动DX = 0的方向的任何方向移动图像, dy = 0,x = 0,y = 0,z = 0,w = 0,dz = 0,dw = 0; {这些,你四个坐标}
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);
}
我已经做了这种方式:
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;
}
});
完成
完美的作品。谢谢。 – HeisenBerg 2018-01-31 17:34:53
我有同样的问题,并设法解决这个问题。也就是说,在屏幕上拖动图像,除了放大和缩小以及以android编程方式在framelayout上旋转图像。刚刚尝试从这个博客这个源代码发布
Android rotate zoom drag image in imageview on touch example ...
下面的代码可以拖动和移动视图。
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;
}
}
所以,你试过你的方式,结果是什么?这段代码是否工作? – Egor 2013-02-11 15:00:08
工作虽然我不触摸图像:( – 2013-02-12 03:49:49
只是试试这个源代码,只是做你需要的东西http://whats-online.info/science-and-tutorials/98/Android-rotate-zoom-drag-image- in-imageview-on-touch-example/ – 2017-01-30 08:15:13