热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android放大手势监听,使用Android的构建手势监听器和缩放侦听器来实现缩小和拖动...

我正在尝试使用Android手势侦听器和缩放侦听器来实现捏缩放和拖动。问题是当我执行缩小缩放时,我想要放大的图像弹跳到特定的位置。变焦位置也不居中。以下代码演示了我要

我正在尝试使用Android手势侦听器和缩放侦听器来实现捏缩放和拖动。问题是当我执行缩小缩放时,我想要放大的图像弹跳到特定的位置。变焦位置也不居中。

以下代码演示了我要实现的内容。任何想法为什么图像跳跃(和如何纠正它)?

public class CustomView extends View {

Bitmap image;

int screenHeight;

int screenWidth;

Paint paint;

GestureDetector gestures;

ScaleGestureDetector scaleGesture;

float scale = 1.0f;

float horizontalOffset, verticalOffset;

int NORMAL = 0;

int ZOOM = 1;

int DRAG = 2;

boolean isScaling = false;

float touchX, touchY;

int mode = NORMAL;

public CustomView(Context context) {

super(context);

//initializing variables

image = BitmapFactory.decodeResource(getResources(),

R.drawable.image_name);

//This is a full screen view

screenWidth = getResources().getDisplayMetrics().widthPixels;

screenHeight = getResources().getDisplayMetrics().heightPixels;

paint = new Paint();

paint.setAntiAlias(true);

paint.setFilterBitmap(true);

paint.setDither(true);

paint.setColor(Color.WHITE);

scaleGesture = new ScaleGestureDetector(getContext(),

new ScaleListener());

gestures = new GestureDetector(getContext(), new GestureListener());

mode = NORMAL;

initialize();

}

//Best fit image display on canvas

private void initialize() {

float imgPartRatio = image.getWidth() / (float) image.getHeight();

float screenRatio = (float) screenWidth / (float) screenHeight;

if (screenRatio > imgPartRatio) {

scale = ((float) screenHeight) / (float) (image.getHeight()); // fit height

horizontalOffset = ((float) screenWidth - scale

* (float) (image.getWidth())) / 2.0f;

verticalOffset = 0;

} else {

scale = ((float) screenWidth) / (float) (image.getWidth()); // fit width

horizontalOffset = 0;

verticalOffset = ((float) screenHeight - scale

* (float) (image.getHeight())) / 2.0f;

}

invalidate();

}

@Override

protected void onDraw(Canvas canvas) {

canvas.save();

canvas.drawColor(0, Mode.CLEAR);

canvas.drawColor(Color.WHITE);

if(mode == DRAG || mode == NORMAL) {

//This works perfectly as expected

canvas.translate(horizontalOffset, verticalOffset);

canvas.scale(scale, scale);

canvas.drawBitmap(image, getMatrix(), paint);

}

else if (mode == ZOOM) {

//PROBLEM AREA - when applying pinch zoom,

//the image jumps to a position abruptly

canvas.scale(scale, scale, touchX, touchY);

canvas.drawBitmap(image, getMatrix(), paint);

}

canvas.restore();

}

public class ScaleListener implements OnScaleGestureListener {

@Override

public boolean onScale(ScaleGestureDetector detector) {

float scaleFactorNew = detector.getScaleFactor();

if (detector.isInProgress()) {

touchX = detector.getFocusX();

touchY = detector.getFocusY();

scale *= scaleFactorNew;

invalidate(0, 0, screenWidth, screenHeight);

}

return true;

}

@Override

public boolean onScaleBegin(ScaleGestureDetector detector) {

isScaling = true;

mode=ZOOM;

return true;

}

@Override

public void onScaleEnd(ScaleGestureDetector detector) {

mode = NORMAL;

isScaling = false;

}

}

public class GestureListener implements GestureDetector.OnGestureListener,

GestureDetector.OnDoubleTapListener {

@Override

public boolean onDown(MotionEvent e) {

isScaling = false;

return true;

}

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2,

float distanceX, float distanceY) {

if (!isScaling) {

mode = DRAG;

isScaling = false;

horizontalOffset -= distanceX;

verticalOffset -= distanceY;

invalidate(0, 0, screenWidth, screenHeight);

} else {

mode = ZOOM;

isScaling = true;

}

return true;

}

}

@Override

public boolean onTouchEvent(MotionEvent event) {

scaleGesture.onTouchEvent(event);

gestures.onTouchEvent(event);

return true;

}

}

提前致谢。



推荐阅读
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • 涉及的知识点-ViewGroup的测量与布局-View的测量与布局-滑动冲突的处理-VelocityTracker滑动速率跟踪-Scroller实现弹性滑动-屏幕宽高的获取等实现步 ... [详细]
  • JDK8新特性详细介绍[java入门]
    本文由java零基础入门栏目为大家介绍JDK8中的一些新特性,欢迎大家来纠错指正!JDK8中的新特性主要有:1、函数式编程;2、Lambda表达式;3、函数式接口;4、方法引用;5 ... [详细]
  • html结构 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • WPF之Binding初探
      初学wpf,经常被Binding搞晕,以下记录写Binding的基础。首先,盗用张图。这图形象的说明了Binding的机理。对于Binding,意思是数据绑定,基本用法是:1、 ... [详细]
author-avatar
真个田_707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有