如何在Android中将ImageView向右移动以获取Activity?

3

我已经实现了一个带有图像视图的应用程序。当用户将图像向右移动时,我想要实现获取下一个活动页面的功能。

我已经使用以下代码来创建imageView:

   (ImageView)findViewById(R.id.slide) //event for move right here

     Intent it = new Intent(Slide.this,NextActivity.class);
     startActivity(it);  

请有人帮帮我...

3个回答

4

如果我理解正确,您想在屏幕上移动并拖动ImageView,在某个特定的位置停止,并启动另一个活动?

如果是这样,您可以尝试使用以下代码...它允许您拖动图像视图在屏幕上移动/拖动

只需将onTouchListener添加到要滑动(移动/拖动)的imageView即可

yourSlideImageViewObject.setOnTouchListener(new View.OnTouchListener() 
{
          @Override
          public boolean onTouch(View v, MotionEvent event) 
          {
                onSlideTouch(v, event);
                return false;
          }
});

然后添加以下代码来处理触摸事件:
public void onSlideTouch( View view, MotionEvent event )
{
    //When the user pushes down on an ImageView
    if ( event.getAction() == MotionEvent.ACTION_DOWN )
    {
       inDragMode = true; //Set a variable so we know we started draggin the imageView
       //Set the selected ImageView X and Y exact position
       selectedImageViewX = Math.abs((int)event.getRawX()-((ImageView)view).getLeft());
       selectedImageViewY = Math.abs((int)event.getRawY()-((ImageView)view).getTop());
       //Bring the imageView in front
       ((ImageView)view).bringToFront();
    }

    //When the user let's the ImageView go (raises finger)
    if ( event.getAction() == MotionEvent.ACTION_UP )
    {
       inDragMode = false; //Reset the variable which let's us know we're not in drag mode anymore
    }

    //When the user keeps his finger on te screen and drags it (slides it)
    if ( event.getAction() == MotionEvent.ACTION_MOVE )
    {
        //If we've started draggin the imageView
        if ( inDragMode )
        {
            //Get the imageView object
            ImageView slide = (ImageView)findViewById(R.id.slide);
            //Get a parameters object (THIS EXAMPLE IS FOR A RELATIVE LAYOUT)
            RelativeLayout.LayoutParams params = RelativeLayout.LayoutParams)slide.getLayoutParams();
            //Change the position of the imageview accordingly
            params.setMargins((int)event.getRawX()-selectedImageViewX, (int)event.getRawY()-selectedImageViewY, 0, 0);
            //Set the new params
            slide.setLayoutParams(params);

            //If we hit a limit with our imageView position
            if( slideImageView_position is inside an interval )
            {
                //Open another activity
                Intent it = new Intent(Slide.this,NextActivity.class);
                startActivity(it);
            }
        }
    }

}

以上代码应该能够使您的ImageView在屏幕上拖动。

您还可以在MotionEvent.ACTION_MOVE事件中实现...以限制ImageView在屏幕上的移动。因此,请检查手指在屏幕上的新坐标,并检查它们是否超出了边界。如果是,则不执行任何操作。如果没有超出边界,则更改ImaveView的左和上边距。

此外,在MotionEvent.ACTION_UP事件中,检查ImaveView的左边距是否超过预定义的限制(这意味着用户将imageView滑动到了您想要的位置)。如果是,您可以继续进行任何操作,例如启动活动。或者,如果您不想在用户拖动时打开活动,而只想在他从imageView中移除手指后才这样做,则只需在MotionEvent.ACTION_MOVE事件下插入我编写的if()语句即可。在那里插入您想要的间隔,因此当imageView在该间隔内被拖动时,活动将开始。

如果您感到困惑,请问 :) 现在已经很晚了,我很累,所以可能没有正确地解释它:D


耶...第一个被接受的答案。哈哈..谢谢。祝你的项目顺利 :) - AndreiBogdan
"yourSlideImageViewObject"和"slide"之间有什么区别,它们是同一个对象吗?此外,这对于线性布局会如何工作? - user1163234
@user1163234,你的SlideimageViewObject可以是任何imageView对象。不过,我不确定这对于线性布局是否有效。你需要试一下 :) 抱歉。 - AndreiBogdan
线性布局有效...你能举个例子说明“如果(slideImageView_position在一个区间内)”吗?我不明白。 - user1163234
prasad.gai 需要检查用户是否将其拖放到特定的位置。例如,您可以获取 imageView 的位置、顶部和左侧。您可以执行类似以下操作:如果顶部值介于 100 和 200 之间,并且 imageView 的左边距介于 50 和 60 之间,则表示 ImageView 已经被拖动到屏幕上所需的位置(比方说在右上角)。 - AndreiBogdan
1
好的解决方案!但是,在onTouch中我确实需要设置return true;,这样事件才能注册到OnTouchListener上。否则,你的代码只能检查ACTION_DOWN事件。也可以参见https://dev59.com/JVfUa4cB1Zd3GeqPEx49#5977889 - Markus Rudel

0

我不太明白你的问题,但我理解为你想将一个包含Activity的ImageView滑动到另一个Activity中。

如果是这样,我建议将这些Activity转换为Fragment,然后使用ViewPager。这里有一篇很好的Google开发者博客文章介绍了这个概念:http://android-developers.blogspot.com/2011/08/horizontal-view-swiping-with-viewpager.html

你需要实现一个FragmentPagerAdapter,其中getCount是用户可以在其间滑动的页面数。然后getItem应该返回一个包含第一个ImageView的Fragment,位置为0,以及包含NextActivity内容的Fragment,位置为1。你可以返回更多的Fragments,用于位置2及更高位置,以便拥有一个可以左右滑动的界面。这希望能给你所寻找的滑动用户体验。


-1

包 avatar.view.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

public class customview extends View {

private int PanX, PanY;
private GestureDetector gestureDetector;
private Bitmap mBitmap;
private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);

public customview(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO 自動生成されたコンストラクター・スタブ
}

public customview(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO 自動生成されたコンストラクター・スタブs
}

public customview(Context context) {
    super(context);
    // TODO 自動生成されたコンストラクター・スタブ
}

private float pointX = 0, pointY = 0;

private void setPoint(MotionEvent e) {
    pointX = e.getX();
    pointY = e.getY();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mBitmap != null) {
        pointX = PanX - (mBitmap.getWidth() / 2);
        pointY = PanY - (mBitmap.getHeight() / 2);
        canvas.drawBitmap(mBitmap, pointX, pointY, mPaint);
    }
}

/*
 * (非 Javadoc)
 * 
 * @see android.view.View#onMeasure(int, int)
 */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // ビューのサイズを設定する
    setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec
            .getSize(heightMeasureSpec));
}

public void setPanX(int panX) {
    PanX = panX;
}

public int getPanX() {
    return PanX;
}

public void setPanY(int panY) {
    PanY = panY;
}

public int getPanY() {
    return PanY;
}

public void setmBitmap(Bitmap mBitmap) {
    this.mBitmap = mBitmap;
}

public Bitmap getmBitmap() {
    return mBitmap;
}

}

自定义一个视图。然后在主活动中使用。

 @Override
public boolean onTouch(View v, MotionEvent e) {
    // TODO 自動生成されたメソッド・スタブ
    if (isSelected == false) {
        return false;
    }
    final int action = e.getAction();
    switch (action) {
    case MotionEvent.ACTION_DOWN:
        panX = (int) e.getX();
        panY = (int) e.getY();

        ctview.setPanX(panX);
        ctview.setPanY(panY);
        ctview.invalidate();
        Log.v("ACTION_DOWN", "ACTION_DOWN");

        break;
    case MotionEvent.ACTION_MOVE:
        panX = (int) e.getX();
        panY = (int) e.getY();

        ctview.setPanX(panX);
        ctview.setPanY(panY);
        ctview.invalidate();
        Log.v("ACTION_MOVE", "ACTION_MOVE");
        break;
    case MotionEvent.ACTION_UP:
        Log.v("ACTION_UP", "ACTION_UP");
        if (isSelected) {
            isSelected = false;
            ctview.setmBitmap(null);
            ctview.invalidate();
        }
        break;
    default:
        break;
    }
    return true;
}

关于 OnCreate

Customview.setmBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ImageSlide);

我的问题是,当用户将图像视图从左向右移动时,我将启动另一个活动,如幻灯片图像。这不是我的答案。 - prasad.gai
为什么不使用ImageView的Ontouch事件呢?您可以使用MotionEvent、MotionEvent.ActionDown和MotionEvent.ActionUp来检查从左到右的滑动。 - Jack Long
我有演示代码。我该如何将它发送给您?请告诉我您的电子邮件地址。 - Jack Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接