`
wang_peng1
  • 浏览: 3940228 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转动一个大图片就和移动一个map一样

阅读更多
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.GestureDetector.OnGestureListener;
import android.view.ViewGroup.LayoutParams;

public class Timeline extends Activity {
   
   ScrollableImageView scrollImageView;
   
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
     
      WindowManager w = getWindowManager();
      Display d = w.getDefaultDisplay();
     
      scrollImageView = new ScrollableImageView(this,
            BitmapFactory.decodeResource(getResources(), R.drawable.rocks),
            d.getWidth(), d.getHeight(),
            null);
      setContentView(scrollImageView);
   }
   
   public boolean onTouchEvent(MotionEvent event) {
      return scrollImageView.getGestureScanner().onTouchEvent(event);
   }
   
   ////
   ////

   class ScrollableImageView extends View {
     
      int scrollRate = 40;
     
      int scrollX = 0;
     
      int scrollY = 0;
     
      boolean scrollHorizontalEnabled = true;
     
      boolean scrollVerticalEnabled = true;
     
      ////
     
      Bitmap image;
     
      Bitmap bufferImage;
     
      int maxWidth;
     
      int maxHeight;
     
      int pictureWidth;
     
      int pictureHeight;
     
      ////
     
      Paint paint;
     
      GestureDetector gestureScanner;
     
      ////
      ////

      public ScrollableImageView(Context context, Bitmap image, int width,
            int height, Paint paint) {
         super(context);
         this.image = image;
         this.paint = paint;
         
         bufferImage = Bitmap.createBitmap(image);
         
         calculateSize(width, height);
         createGestureListener();
      }
     
      public ScrollableImageView(Context context, Bitmap image,
            int width, int height, Paint paint,
            boolean scrollHorizontal, boolean scrollVertical) {
         super(context);
         this.image = image;
         this.paint = paint;
         this.scrollHorizontalEnabled = scrollHorizontal;
         this.scrollVerticalEnabled = scrollVertical;
         
         bufferImage = Bitmap.createBitmap(image);
         
         calculateSize(width, height);
         createGestureListener();
      }
     
      protected void calculateSize(int width, int height) {
         
         //picture size
         pictureWidth = image.getWidth();
         pictureHeight = image.getHeight();
         
         //window size
         maxWidth = Math.min(pictureWidth, width);
         maxHeight = Math.min(pictureHeight, height);
         
         //layout size
         setLayoutParams(new LayoutParams(pictureWidth, pictureHeight));
      }
     
      protected void createGestureListener(){
         setGestureScanner(new GestureDetector(new OnGestureListener() {
           
            public boolean onScroll(MotionEvent event1, MotionEvent event2,
                  float distanceX, float distanceY) {
               handleScroll(distanceX, distanceY);
               return true;
            }

            public boolean onDown(MotionEvent event) {
               return true;
            }
           
            public boolean onFling(MotionEvent event1, MotionEvent event2,
                  float velocityX, float velocityY) {
               return true;
            }

            public void onLongPress(MotionEvent event) {
               //do nothing
            }

            public void onShowPress(MotionEvent event) {
               //do nothing
            }

            public boolean onSingleTapUp(MotionEvent event) {
               return true;
            }
         }));
      }

      @Override
      protected void onDraw(Canvas canvas) {
         canvas.drawBitmap(bufferImage, 0, 0, paint);
      }

      protected void handleScroll(float distX, float distY) {
         
         int maxScrollX = Math.max(pictureWidth - maxWidth, 0);
         int maxScrollY = Math.max(pictureHeight - maxHeight, 0);
         
         //X-Axis
         if(scrollHorizontalEnabled){
            if (distX > 6.0) {
               if (scrollX < maxScrollX - scrollRate) {
                  scrollX += scrollRate;
               }
               else {
                  scrollX = maxScrollX;
               }
            } else if (distX < -6.0) {
               if (scrollX >= scrollRate) {
                  scrollX -= scrollRate;
               }
               else {
                  scrollX = 0;
               }
            }
         }

         //Y-AXIS
         if(scrollVerticalEnabled){
            if (distY > 6.0) {
               if (scrollY < maxScrollY - scrollRate) {
                  scrollY += scrollRate;
               }
               else {
                 
               }
            } else if (distY < -6.0) {
               if (scrollY >= scrollRate) {
                  scrollY -= scrollRate;
               }
               else {
                  scrollY = 0;
               }
            }
         }
         
         //Swap image
         if ((scrollX <= maxWidth) && (scrollY <= maxHeight)) {
            swapImage();
            invalidate();
         }
      }
     
      protected void swapImage() {
         bufferImage = Bitmap.createBitmap(image, scrollX, scrollY,
               maxWidth, maxHeight);
      }

      /**
       * @return the gestureScanner
       */
      public GestureDetector getGestureScanner() {
         return gestureScanner;
      }

      /**
       * @param gestureScanner the gestureScanner to set
       */
      public void setGestureScanner(GestureDetector gestureScanner) {
         this.gestureScanner = gestureScanner;
      }
   }
}
http://www.anddev.org/scrolling_a_picture_horizontally_and_vertically-t3245.html
分享到:
评论

相关推荐

    ThreeJs开发(移动,旋转,相机,纹理,鼠标事件等源代码)

    Three.js提供了一个框架,使开发者能够轻松地创建3D模型和场景。它包含了一系列对象,如几何体、材质、光源、相机和渲染器,用于构建和展示3D世界。 二、创建场景和几何体 在Three.js中,首先需要创建一个Scene对象...

    AS3地图转动

    在本文中,我们将深入探讨AS3(ActionScript 3)中的地图转动实现,这是一个在游戏开发、导航系统或任何需要互动地图的应用程序中常见的功能。AS3是Adobe Flash Professional和FlashDevelop等工具所使用的编程语言,...

    360度旋转图片.rar

    5. 移动设备支持:考虑到移动设备的普及,360度旋转图片也需要适应不同的操作系统和设备,例如iOS和Android。开发时要考虑设备的硬件性能和触摸屏操作,确保流畅的用户体验。 6. VR兼容:对于虚拟现实应用,360度...

    VR图片浏览

    总之,“VRPanoDemo”作为一个VR图片浏览器,它不仅提供了丰富的全景图片浏览体验,还考虑到了多平台兼容、用户交互和性能优化等多个方面,让用户体验到虚拟现实带来的无限魅力。随着VR技术的不断发展,这类应用将会...

    Photoshop3D图层来制作一个真实的地球.doc

    通过以上步骤,你就可以在Photoshop中创建出一个逼真的3D地球模型了。 这个教程展示了Photoshop 3D功能的强大之处,对于想要学习3D图形设计的用户来说,是一份非常有价值的资源。通过实践,你可以掌握如何利用软件...

    使用百度地图JavaScript API 画轨迹,给出自定义图标和标注

    这是一项在Web开发中常用于地理位置展示和分析的重要技术。首先,我们需要理解百度地图API的基础概念及其核心功能。 百度地图JavaScript API 是一个强大的工具,它允许开发者在网页上集成地图功能,包括地图展示、...

    Arduino项目开发 StarterKit_BasicKit_p05_ServoMoodIndicator_p05_Servo

    `map()`函数将一个数值从一个范围映射到另一个范围。在本例中,`map(potVal, 0, 1023, 0, 179)`将电位器的读取值从0到1023转换为舵机能接受的0到179的范围。 7. **串行通信(Serial Communication)**: `Serial....

    CS 第一人称视角的实现,适合3D游戏开发人员

    第一人称视角是指游戏中的摄像机位置与玩家角色的位置完全一致,玩家所看到的画面就像是通过自己的眼睛观察到的一样。这种视角在射击类游戏中尤为常见,可以极大地提高游戏的真实感和代入感。 #### 二、技术实现...

    全景数据采集

    在移动设备上,可以结合陀螺仪和加速度计数据,实现基于用户头部转动的视角切换。此外,虚拟现实头显如Oculus Rift或HTC Vive也能提供沉浸式的全景体验,用户可以在虚拟环境中自由探索。 总的来说,全景数据采集是...

    arduino-变阻器拨钮程序

    在机器人应用中,如果这个变阻器与机械关节的旋转角度相连,那么关节转动时,变阻器的值就会相应变化,通过Arduino读取并处理这些信息,我们可以精确控制或监测关节的角度。这在小型机器人、人形机器人或者教育...

    PLC对机械手位置控制的研究.pdf

    每个脉冲信号使伺服电机转动一定的角度,机械手因此沿设定路径移动一定的距离。在本例中,一个脉冲使得机械手移动0.01mm。伺服驱动器参数PrO.08=6000表示每个伺服电机旋转一周,需要6000个脉冲信号,由于同步轮的...

    C++编程-时钟程序.doc

    为了使时钟看起来像在移动,可能还会使用动画技术,例如改变指针的角度以模拟时针、分针和秒针的转动。这通常涉及到对`OnPaint`消息的处理,以及使用`CDC`(设备上下文类)进行绘图。 总的来说,这个C++时钟程序...

    VR360全景浏览

    【VR360全景浏览】是一种沉浸式技术,它通过模拟真实环境的360度全方位视角...从拍摄制作到展示交互,每一个环节都直接影响着用户的沉浸感和满意度。随着VR技术的发展,我们有理由期待更丰富、更真实的360度全景体验。

    C#版俄罗斯方块

    在这个项目中,开发者利用C#的强大功能,构建了一个交互式的俄罗斯方块游戏平台,玩家可以在其中体验到经典的游戏玩法。 首先,我们来探讨一下游戏的核心——交错数组(Map)。在俄罗斯方块中,地图是游戏的基础,...

    Apollo自动驾驶入门课程第①讲—无人驾驶概览.pdf

    无人驾驶车的工作原理是使用计算机视觉和传感器融合,获取一幅关于我们在世界上的位置的丰富图片,使 用定位确定我们在这个世界的精确位置,然后使用路径规划来绘制一条通过这个世界到达目标的地的路径,通过控制...

    MFCApplicationGL4.zip

    环视天空盒(Cubemap Skybox)则是天空盒的一种实现方式,它将六个平面图像拼接成一个立方体形状,分别对应前后左右上下六个方向。当相机移动或旋转时,对应的贴图会相应变化,从而创造出一种无限远的视觉效果。 在...

    android vr视频播放器

    常见的VR视频格式有equirectangular(等距柱状投影)、cubemap(立方体贴图)等,其中equirectangular格式最为常见,它将全景图像映射到一个二维平面,便于处理和存储。VR视频播放器需要支持这些格式的解码和渲染。 ...

    MapTest.rar

    在移动应用开发中,经常会遇到集成地图服务的需求,Cordova作为一个流行的开源框架,允许开发者使用HTML、CSS和JavaScript来构建原生的移动应用。在这个"MapTest.rar"压缩包中,我们看到的是一个Cordova项目,它展示...

    STM32步进电机自动返回小车

    【STM32步进电机自动返回小车】项目是一个基于STM32微控制器的智能小车设计,利用步进电机实现精确的定位和移动。在这个系统中,STM32芯片作为核心控制器,负责处理传感器输入、电机控制以及路径规划等任务。步进...

Global site tag (gtag.js) - Google Analytics