Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何创建可从不同部分点击的大图像

如何创建可从不同部分点击的大图像
EN

Stack Overflow用户
提问于 2012-05-09 12:41:01
回答 2查看 269关注 0票数 0

如何使大图可从不同的部分点击,即当我点击任意元素时,我有一个类似于元素周期表的大图,然后它根据元素执行操作,我们只有一个图像

它如何实现

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2012-05-09 12:46:24

通过扩展View类在Canvas上显示图像,然后onTouch()计算x,y坐标。

您可以使用以下命令:

代码语言:javascript
运行
AI代码解释
复制
public class MyImageView extends View {

private static final int INVALID_POINTER_ID = -1;

    private Drawable mImage;
    private float mPosX;
    private float mPosY;

    private float mLastTouchX;
    private float mLastTouchY;
    private int mActivePointerId = INVALID_POINTER_ID;

    private ScaleGestureDetector mScaleDetector;
    private float mScaleFactor = 1.f;

    public MyImageView(Context context) {
        this(context, null, 0);
    mImage = getResources().getDrawable(R.drawable.imagename);

        mImage.setBounds(0, 0, mImage.getIntrinsicWidth(), mImage.getIntrinsicHeight());
    }

    public MyImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // Let the ScaleGestureDetector inspect all events.
        mScaleDetector.onTouchEvent(ev);

        final int action = ev.getAction();
        switch (action & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN: {
            final float x = ev.getX();
            final float y = ev.getY();

            mLastTouchX = x;
            mLastTouchY = y;
            mActivePointerId = ev.getPointerId(0);
            break;
        }

        case MotionEvent.ACTION_MOVE: {
            final int pointerIndex = ev.findPointerIndex(mActivePointerId);
            final float x = ev.getX(pointerIndex);
            final float y = ev.getY(pointerIndex);

            // Only move if the ScaleGestureDetector isn't processing a gesture.
            if (!mScaleDetector.isInProgress()) {
                final float dx = x - mLastTouchX;
                final float dy = y - mLastTouchY;

                mPosX += dx;
                mPosY += dy;

                invalidate();
            }

            mLastTouchX = x;
            mLastTouchY = y;

            break;
        }

        case MotionEvent.ACTION_UP: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_CANCEL: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_POINTER_UP: {
            final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 
                    >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
            final int pointerId = ev.getPointerId(pointerIndex);
            if (pointerId == mActivePointerId) {
                // This was our active pointer going up. Choose a new
                // active pointer and adjust accordingly.
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mLastTouchX = ev.getX(newPointerIndex);
                mLastTouchY = ev.getY(newPointerIndex);
                mActivePointerId = ev.getPointerId(newPointerIndex);
            }
            break;
        }
        }

        return true;
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.save();
        Log.d("DEBUG", "X: "+mPosX+" Y: "+mPosY);
        canvas.translate(mPosX, mPosY);
        canvas.scale(mScaleFactor, mScaleFactor);
        mImage.draw(canvas);
        canvas.restore();
    }

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            mScaleFactor *= detector.getScaleFactor();

            // Don't let the object get too small or too large.
            mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));

            invalidate();
            return true;
        }
    }

}
票数 1
EN

Stack Overflow用户

发布于 2012-05-09 12:47:14

您插入单独的图像视图,对于每个图像,它将是一个周期性元素。然后单击listeners来分离图像。

如果你使用实时元素周期表,这将是一个笨拙的代码。

如果您接受答案,请单击right。

如果有什么问题,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10516321

复制
相关文章
(三)回调 ref 中调用次数问题
# 🍇一、回调形式的 ref 的调用次数 class Demo { showInfo = () => { let {input} = this alert(input.value) } render() { return ( <div> <input ref={(currentNode) => this.input = currentNode; console.log('@',
老怪兽
2023/02/22
7250
(三)回调 ref 中调用次数问题
JS调用栈/回调队列/事件循环
单线程容易遇到一个问题:阻塞 解决办法:异步回调 解决原理:调用栈把会阻塞的函数丢到Web APIs里,Web APIs再把它丢到回调队列里, 通过事件循环——看着调用栈空了,就把回调队列里的函数丢回调用栈里让它执行
杨肆月
2019/08/20
4.1K0
JS调用栈/回调队列/事件循环
微信支付分 - 回调通知API
2.用户开启、停用服务异步回调通知的URL,是在通过第三方代办填写配置表时配置的,如果填写配置表,实际测试没收到消息,请及时联系他们配置下。
JaneYork
2023/10/11
3100
SystemVerilog中的callback(回调)
在第二次systemverilog实验中,我看到有同学用到了callback函数,今天就是简单讲讲这个方法。
数字IC小站
2020/06/30
2.7K0
回调
回调简单而言:在一个类(A)的方法(a)中调用另一个类(B)的方法(b),当方法(b)执行完之后就调用类(A)中的方法(c),这就是回调的过程,是不是很简单?简单分析可以知道一个类(A)持有另一个类(B)的引用,方法(c)就叫做回调函数,画成UML图就如下所示:
晚上没宵夜
2020/03/10
2.6K0
iOS中的「回调(callback)」
本文主要参考:《Object-C 编程 Big Nerd Ranch Guide》一书第24章
iOS Development
2019/02/14
3.6K0
javascript异步中的回调
我们之前介绍了javascript异步的相关内容,我们知道javascript以同步,单线程的方式执行主线程代码,将异步内容放入事件队列中,当主线程内容执行完毕就会立即循环事件队列,直到事件队列为空,当用产生用户交互事件(鼠标点击,点击键盘,滚动屏幕等待),会将事件插入事件队列中,然后继续执行。 处理异步逻辑最常用的方式是什么?没错这就是我们今天要说的---回调
陌上寒
2019/04/02
2.2K0
javascript异步中的回调
java 中的异步回调
异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作
菩提树下的杨过
2018/01/18
3.3K0
java 中的异步回调
​29 - 回调函数和回调地狱
原文地址:https://dev.to/bhagatparwinder/callback-functions-callback-hell-79n
前端黑板报
2022/12/01
4.7K0
什么是回调地狱?如何解决回调地狱问题_地狱回调
这个问题呢,需要从Node.js的API说起,这里就会有人问了?博主你不是说回调地狱的问题吗,怎么说到API了,别急,看博主一步一步的解释给你听:
全栈程序员站长
2022/11/15
3.2K0
MessageHandler 高级用法二:原生调用JS 实现回调
在 上一篇中 我们实现了原生和JS 的方法调用,这篇解决一下在 APP 中调用JS方法时怎么含有 JS 的回调
onety码生
2018/11/21
4.2K0
JavaScript异步调用操作可增加finally回调
JavaScript异步调用操作(如远程服务、本地任务)的API一般只提供的执行成功(success)和执行失败(fail)的回调,其实还可以提供一个无论执行成功还是失败最终都会执行的回调(finally),使得一些扫尾工作不用在成功和失败的回调代码中都重复写一遍,流程更加清晰规整。
LeoXu
2018/08/15
5520
ajax中回调的几个坑
在前端开发中,经常要用ajax去拿后台接口返回的数据,总结几个ajax的回调的常见问题,供大家参考爬坑。
全栈程序员站长
2022/07/21
7670
java中如何实现"回调函数"
既然我们知道回调函数的用途是事件的响应,那么我们就从这里入手。 假设我们有这样一个场景,一家人坐在一起吃饭,但是我们中国的规矩是,长辈没动筷子,小辈们是不能动的,所以必须等着长辈动筷子这一事件完成之后,小辈们才能开始。 接下来我们就用回调函数来解决。由于java中没有指针一说,故而也没了*,但是java提供了 接口帮我们实现 回调函数,俗称 接口回调。
林老师带你学编程
2019/05/25
1.9K0
JavaScript中的回调函数(callback)
被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数。
刘亦枫
2020/03/19
7.2K0
七、回调
修改PspNotifyEnableMask为00000009,创建和退出进程时就不会触发回调
zhang_derek
2022/09/29
1.7K0
关于回调
爱学习的前端歌谣
2023/10/18
2210
关于回调
基于Guava API实现异步通知和事件回调
当小伙伴们在社区提问时,如果有设置指定用户回答,则对应的用户就会收到邮件通知,这就是观察者模式的一种应用场景。有些小伙伴可能会想到MQ、异步队列等,其实JDK本身就提供这样的API。我们用代码来还原这样一个应用场景,首先创建GPer类。
Tom弹架构
2021/11/17
6800
基于Guava API实现异步通知和事件回调
当小伙伴们在社区提问时,如果有设置指定用户回答,则对应的用户就会收到邮件通知,这就是观察者模式的一种应用场景。有些小伙伴可能会想到MQ、异步队列等,其实JDK本身就提供这样的API。我们用代码来还原这样一个应用场景,首先创建GPer类。
Tom弹架构
2021/12/21
7180
基于Guava API实现异步通知和事件回调
如何在回调函数中获取 WordPress 接口的当前优先级
首先这是一个比较深的问题,一般情况下用不到,但是一些很特殊的情况下需要用到,如果用到了,这篇文章就对你有很大的帮助。下面开始教程:
Denis
2023/04/13
5530

相似问题

回调函数(如afterMove)不被调用

17

用Dart/Flutter调用多个回调

10

Flutter没有调用javascript回调函数

210

API调用和回调

156

在回调中组织API调用

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档