Je veux juste une chose simple. J'ai un imageview
et je peux le déplacer avec le toucher
Ceci est mon code, je suis désolé si cela ne va pas parce que je viens de l'essayer moi-même
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);
}
Pouvez-vous me montrer le bon chemin s'il vous plaît?
Les événements onTouch
pour faire glisser des vues fonctionnent parfaitement pour les vues enfant de RelativeLayout
et FrameLayout
.
Voici un exemple:
@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;
}
Maintenant, ce que font dx
et dy
, c’est, sur ACTION_DOWN
, qu’il enregistre l’emplacement où vous avez touché la vue et obtient la différence entre la gauche (x) et le haut (y) de la vue, afin de conserver ces marges pendant ACTION_MOVE
.
L'événement de retour de contact doit être true
si vous y assistez.
Mise à jour: pour API 8
Dans le cas de l'API 8, les méthodes getX()
et getY()
ne donnent pas des résultats corrects. Vous pouvez donc utiliser les méthodes getRawX()
et getRawY()
.
Exemple :
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;
}
J'ai fait comme ça:
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;
}
});
Terminé
J'ai eu le même problème et j'ai réussi à le résoudre. C'est-à-dire, faites glisser l'image à l'écran, outre le zoom avant et arrière et la rotation de l'image sur framelayout dans Android par programmation. Essayez juste ce code source à partir de ce blog
Android faire pivoter le zoom faire glisser l'image dans l'image sur exemple tactile ...
Le code suivant permet de glisser et déplacer une vue.
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();
}
Si vous souhaitez déplacer votre image dans n’importe quelle direction, vous devez imprimer la direction . Vous devez alors suivre l’étape suivante . x = 0, y = 0, z = 0, w = 0, dz = 0, dw = 0; {ces quatre vous coordonnez}
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);
}