![](/img/trans.png)
[英]Trying to move an ImageView in a touch event via setLayoutParams, imageview is not moving
[英]Moving imageview with touch event
我只想要一個簡單的事情。 我有一個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中以編程方式在framelayout上旋轉圖像。 只需從此博客文章中嘗試此源代碼即可
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; {這四個坐標}
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);
}
以下代碼允許拖動和移動視圖。
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.