ontouchevent-在onTouchEvent()时间里面加了一个scale 缩放动画效果,效果和预期不同

问题描述

在onTouchEvent()时间里面加了一个scale 缩放动画效果,效果和预期不同
//设置动画属性
  animation = new ScaleAnimation(1.0f, 0.5f, 1.0f, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
    animation.setDuration(500);// 设置动画持续时间
    animation.setRepeatCount(1);// 设置重复次数
    animation.setRepeatMode(Animation.REVERSE);

    //onTouchEvent()事件
    public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            int width = iv.getWidth();
            int height = iv.getHeight();
            iv.setX(event.getX() - (width/2) );//iv是图片所在的imageView控件
            iv.setY(event.getY() - (height/2) );
            iv.startAnimation(animation);
            break;
        }
    return true;
}

就是想实现一个类似相机手动点击聚焦的动画效果,但是实际效果是在点击屏幕后动画位置能确定,但是缩放中心是变化的,并不是设置的图片的中心点,请有经验的人帮忙指出问题,多谢!

解决方案

因为你做动画前突然setX值等,中心不好确定了。换用ObjectAnimation或ValueAnimation吧,自己实现缩放机制
ValueAnimator valueAnimator = ValueAnimator.ofFloat(1, 0.5f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float v = (Float) animation.getAnimatedValue();
ball.setScaleX(v);
ball.setScaleY(v);
}
});
valueAnimator.setDuration(500);// 设置动画持续时间
valueAnimator.setRepeatCount(1);// 设置重复次数
valueAnimator.setRepeatMode(Animation.REVERSE);
@Override
public boolean onTouch(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
int width = ball.getWidth();
int height = ball.getHeight();
ball.setX(event.getX() - (width / 2));//ball是图片所在的imageView控件
ball.setY(event.getY() - (height / 2));

            ball.setPivotX(ball.getWidth() / 2f);
            ball.setPivotY(ball.getHeight() / 2f);

            valueAnimator.start();
            break;
    }
    return true;
}

解决方案二:

这个问题我遇到过,是因为你用错了方法。

MotionEvent里有如下两种方法(对应y轴也一样),一个是getX(),一个是getRawX()。

这两个方法是有区别的。

getX()是指当前你的手指在touch的控件上相对该控件的位置(也就是iv的位置)。当你的手指移动时,你的控件跟着移动,这个时候,你的手指和iv的相对位置又发生了变化,就会发生iv一直跳动的现象

getRawX()是你的手指相对于屏幕的位置,这个原坐标是固定的。一般要实现控件跟随,都是用此方法。

时间: 2024-11-29 09:30:37

ontouchevent-在onTouchEvent()时间里面加了一个scale 缩放动画效果,效果和预期不同的相关文章

c++-向opengl中加载一个3ds文件的问题........

问题描述 向opengl中加载一个3ds文件的问题........ 我在网上找了好多有关的资料和代码,几乎都是win32的程序.我没学过windows编程,理解起来好费劲啊!我学习opengl只有几天的时间,估计连个新手也算不上,不知道那位能给提供一个能运行的控制台的代码.... 对于3ds里面的文件结构我基本上了解了一些,我主要想看看加载的代码该如何写呢? 谢谢..

日期加减-c++如何实现时间的加减操作?

问题描述 c++如何实现时间的加减操作? c++如何实现时间的加减操作,比如有一个时间2015-03-30 23:20:20,我想减去一个月,加上2小时,如何实现??望高手赐教,代码越简洁越好! 解决方案 分别单独处理时间和日期 如果时间处理时,发现要对日期进行变化,则调用日期变化的功能.日期变化的功能,其实也不难.就是麻烦. 需要判断是否是闰年?然后按 1.3.5.7.8.10.12 和 除了2月之外的其它月进行处理. 解决方案二: 可以自己写一个时间类,然后重载加减运算符 解决方案三: CT

javascript-diiv点击时间数据加载中显示加载中图片加载完还原

问题描述 diiv点击时间数据加载中显示加载中图片加载完还原 <div class="lead-more" id="lead-more" style="margin-top: 120px;"><a href="javascript:;">查看更多>></a></div> $(document).ready(function(){ $("#lead-more&

asp.net 获取当前时间做加减操作

问题描述 asp.net 获取当前时间做加减操作 asp.net 获取当前时间做加减操作 DateTime.Now.ToString("yyyy-MM-dd"); 获取当前时间在这基础上减7天 或者一个月 或者 一季 解决方案 AddDays(-7) AddMonth(-1) 季度这个没有,可以这么写 AddMonth(1 - DateTime.Now.Month % 3) 解决方案二: ASP.NET时间操作asp.net获取当前时间asp.net获取当前时间

applicationContext.xml加了一个实体映射就提示找不到路径了。

问题描述 applicationContext.xml加了一个<value>com/sinews/insurance/entity/mapping/HotCustomerVisitLog.hbm.xml</value>实体映射,发布项目就提示找不到路径了. 问题补充:可是我那里都是用/这个反斜杠的,十几个实体类都那么写没事,我新增了一个实体类,然后加进去就提示项目找不到路径了wangqj 写道 解决方案 你的意思是说,你复制前面的实体类,然后改了一下名字,然后呢.就发现还是报错.那

使用常对象——为共用数据加装一个名为const的玻璃罩

原创案例讲解--"玻璃罩const"系列的三篇文章: 1. 使用常对象--为共用数据加装一个名为const的玻璃罩 2. 常(const)+ 对象 + 指针:玻璃罩到底保护哪一个 3. 对象更有用的玻璃罩--常引用 话题的引入:C++采取了不少有效的措施(如设private保护)以增加数据的安全性,但也可以在不同的场合通过不同的途径访问同一个数据对象.有时在无意之中的误操作会改变有关数据的状况,而这是人们不希望出现的. 例如: //程序1 #include <iostream&g

as3-flash里怎么实现把一个元件加到一个移动的影片剪辑上,并随之移动

问题描述 flash里怎么实现把一个元件加到一个移动的影片剪辑上,并随之移动 怎么用代码控制添加元件到影片剪辑上,实现影片剪辑播放后放在上面的元件一起移动 解决方案 addChilde就行了 解决方案二: addChilde就行了 解决方案三: addChilde就行了,楼上说的是对的. 解决方案四: 支持看楼上的观点!!addChild

windows编程 在一个窗口上加载一个位图图片

问题描述 windows编程 在一个窗口上加载一个位图图片 希望前辈们能给个demo程序.或者最基本的窗口上加载一个位图图片就好,加载位图时用的LoadImage 初学windows编程,不太懂上下文设备,希望大神能给个例程,让我学习. 解决方案 c++windows编程加载图片 解决方案二: #include #include "resource.h" LRESULT CALLBACK WndProc1(HWND hwnd,UINT message,WPARAM wParam,LPA

sqlserver 存储过程-sql server 存储过程 树节点 每次加载一个节点

问题描述 sql server 存储过程 树节点 每次加载一个节点 有一张数据表A,表字段:treeid,treeparentid,treename三个字段,现在要用存储过程建一个树目录结构的菜单,初始化时,只加载根节点和所有的一级子节点,一级子节点下面的子节点初始化时不加载,初始化完成之后,我们点击一级子节点菜单,它才会加载选中的节点菜单下面的子节点,每次加载一级节点,无限次加载.非常急,在线等,本人第一次在CSDN上提问,不知道要不要分,好像有几十分,都给,写存储过程的时候,请把存储过程的几