添加多个 imageview 到 Flipper 并将图像从 url 加载到这些 imageview

发布于 2024-11-17 00:59:01 字数 4283 浏览 5 评论 0原文

我是 android 新手,试图对从 imageview 中的 url 加载的图像实现滑动效果...我成功了,但现在我希望应该加载多个 url,并且我可以通过滑动来一一查看它们将手指放在设备屏幕上作为覆盖整个屏幕的单个图像... 我尝试了很多 bt 未能实现.. 我不知道会使用多个图像视图......一些 for 循环和循环数组还是什么!!! 只是无能为力,因为尝试了 30 多次......

请有人帮忙......提前感谢......

这是我的代码:

package com.conn;

import android.R;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class swipe_touch extends Activity {
    private static final String LOGID = "CHECKTHISOUT";

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private GestureDetector gestureDetector;
    View.OnTouchListener gestureListener;

    private Animation slideLeftIn;
    private Animation slideLeftOut;
    private Animation slideRightIn;
    private Animation slideRightOut;
    private ViewFlipper viewFlipper;

    String message = "Initial Message"; 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.main);
      //Set up viewflipper
        viewFlipper = new ViewFlipper(this);  

        ImageView[] img = new ImageView[i];
        j_comm_func funs = new j_comm_func();//already made this class
        BitmapFactory.Options bmOptions;
        bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;
        Bitmap bm = funs.LoadImage("http://65.175.77.34/newsnow/2462011/largest3/2462011-md-hr-1.jpg", bmOptions);
        img.setImageBitmap(bm);


        viewFlipper.addView(img);



        //set up animations
        slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_out_right);
        slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_in_left);
        slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_in_left);
        slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_out_right);


        //put up a brownie as a starter
        setContentView(viewFlipper);

        gestureDetector = new GestureDetector(new MyGestureDetector());
    }

    public class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                // right to left swipe
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.v(LOGID,"right to left swipe detected");
                    viewFlipper.setInAnimation(slideLeftIn);
                    viewFlipper.setOutAnimation(slideLeftOut);
                    viewFlipper.showNext();
                    setContentView(viewFlipper);

                } // left to right swipe 
                else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.v(LOGID,"left to right swipe detected");                    
                    viewFlipper.setInAnimation(slideRightIn);
                    viewFlipper.setOutAnimation(slideRightOut);
                    viewFlipper.showPrevious();
                    setContentView(viewFlipper);

                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }
    }

    // This doesn't work
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (gestureDetector.onTouchEvent(event)){
            Log.v(LOGID,"screen touched");
            return true;
        }
        else{
            return false;
        }
    }
}

i am new to android and was trying to implement swipe effects on images loaded from url in an imageview...and i succeeded but now i want more than one url should be loaded and i can able to see them all one by one by swiping finger on the device screen as a single image covering the whole screen...
i tried very much bt fails to implement..
i dont know more than one image view will be used....some for loop & array or what!!!
just helpless b'coz attempted more than 30 times...

pls somebody help....thanx in advance......

this is my code:

package com.conn;

import android.R;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class swipe_touch extends Activity {
    private static final String LOGID = "CHECKTHISOUT";

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private GestureDetector gestureDetector;
    View.OnTouchListener gestureListener;

    private Animation slideLeftIn;
    private Animation slideLeftOut;
    private Animation slideRightIn;
    private Animation slideRightOut;
    private ViewFlipper viewFlipper;

    String message = "Initial Message"; 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.main);
      //Set up viewflipper
        viewFlipper = new ViewFlipper(this);  

        ImageView[] img = new ImageView[i];
        j_comm_func funs = new j_comm_func();//already made this class
        BitmapFactory.Options bmOptions;
        bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;
        Bitmap bm = funs.LoadImage("http://65.175.77.34/newsnow/2462011/largest3/2462011-md-hr-1.jpg", bmOptions);
        img.setImageBitmap(bm);


        viewFlipper.addView(img);



        //set up animations
        slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_out_right);
        slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_in_left);
        slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_in_left);
        slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_out_right);


        //put up a brownie as a starter
        setContentView(viewFlipper);

        gestureDetector = new GestureDetector(new MyGestureDetector());
    }

    public class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                // right to left swipe
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.v(LOGID,"right to left swipe detected");
                    viewFlipper.setInAnimation(slideLeftIn);
                    viewFlipper.setOutAnimation(slideLeftOut);
                    viewFlipper.showNext();
                    setContentView(viewFlipper);

                } // left to right swipe 
                else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.v(LOGID,"left to right swipe detected");                    
                    viewFlipper.setInAnimation(slideRightIn);
                    viewFlipper.setOutAnimation(slideRightOut);
                    viewFlipper.showPrevious();
                    setContentView(viewFlipper);

                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }
    }

    // This doesn't work
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (gestureDetector.onTouchEvent(event)){
            Log.v(LOGID,"screen touched");
            return true;
        }
        else{
            return false;
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

淤浪 2024-11-24 00:59:01

好吧...您的方法 onTouchEvent 不起作用,因为所有触摸事件都由 ViewFlipper 消耗(从文档到此活动的方法:

当触摸屏事件未被其下的任何视图处理时调用。这对于处理发生在窗口边界之外的触摸事件非常有用,因为没有视图可以接收它。

要实现你想要的东西,请看这里: 具有多个视图的 Android 触摸事件(例如 Viewfliper 中的 ListView)

在您的情况下,您应该执行以下操作:

img.setOnTouchListener(new DragableViewTouchListener());

要添加缩放功能,您可以做很多事情...我建议您这样做这以下:

  1. 创建 ImageView 的扩展:ZoomableImageVIew
  2. 像这样重写方法dispatchTouchEvent:

    公共布尔dispatchTouchEvent(MotionEvent事件){
    如果(需要缩放(事件)){
       doZoom();
       // 事件已处理。不要传播它以防止在 ViewFlipper 中处理它。
       返回真;
    } 别的 {
       // 传播事件(到 ViewFlipper)
       super.dispatchTouchEvent(事件);
    }
    

    }

祝你好运!!

Well... your method onTouchEvent doesnt work because all touch events are consumed by ViewFlipper (from docs to this activity's method:

Called when a touch screen event was not handled by any of the views under it. This is most useful to process touch events that happen outside of your window bounds, where there is no view to receive it.
)

To implement the thing you want take a look here: Android touch events with multiple views(such as a ListView in a Viewflliper)

In your case you should do something like this:

img.setOnTouchListener(new DragableViewTouchListener());

To add zoom features you can do many things...I advise you to do the following:

  1. Create the extension of ImageView: ZoomableImageVIew
  2. Override the method dispatchTouchEvent like this:

    public boolean dispatchTouchEvent(MotionEvent event) {
    if(needZoom(event)) {
       doZoom();
       // the event was handled. Do not propagate it to prevent handling it in ViewFlipper.
       return true;
    } else {
       // propagate the event (to ViewFlipper)
       super.dispatchTouchEvent(event);
    }
    

    }

Good luck !!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文