2 how old how_old 于 2016.05.10 09:08 提问

android 关于onTouch跟动画的结合

图片说明我想让控件在屏幕上滑动,当手指放开屏幕的时候控件回到他原本的位置,我应该要怎么改,求大神指导!

6个回答

lxk_1993
lxk_1993   Rxr 2016.05.10 09:15
已采纳

你可以先记录原来的位置 再在Action_UP时 用动画移动到 原来的位置

lxk_1993
lxk_1993 回复how_old: 看下你的代码
大约 2 年之前 回复
how_old
how_old 滑动一次后,再按其他按钮,可以滑动的按钮的就不见。。。该怎么弄
大约 2 年之前 回复
how_old
how_old 弄好了,谢谢
大约 2 年之前 回复
lxk_1993
lxk_1993 回复how_old: 参考http://blog.csdn.net/lxk_1993/article/details/50931607
大约 2 年之前 回复
how_old
how_old 我是继承Fragment的,没有onWindowFocusChanged这个方法
大约 2 年之前 回复
lxk_1993
lxk_1993 回复how_old: 不过actionmove 里面需要改
大约 2 年之前 回复
lxk_1993
lxk_1993 回复how_old: 写好了 在下面
大约 2 年之前 回复
how_old
how_old 回复103style: 那要怎么用呢
大约 2 年之前 回复
lxk_1993
lxk_1993 回复how_old: 写了一个 这里动画不能这么用 你写的这种动画并没有改变实际的位置
大约 2 年之前 回复
how_old
how_old 回复103style: 好的,谢谢
大约 2 年之前 回复
lxk_1993
lxk_1993 回复how_old:我试试 写好给你
大约 2 年之前 回复
how_old
how_old 有记录原来的位置,但是第一次点击的时候没有动画,并且以后点击的时候用translateAnimation动画时效果也不是回到右上角,而是回到鼠标放开时候的位置
大约 2 年之前 回复
q610098308
q610098308   2016.05.10 09:24

1.其实你需要改变控件的位置,
见demo
http://download.csdn.net/detail/q610098308/9511644

how_old
how_old 回复恋恋西风: 好的,不过东西有点多,只能慢慢的往Android Studio那边靠
大约 2 年之前 回复
q610098308
q610098308 如果你做Android 开发,建议用 Android Studio
大约 2 年之前 回复
how_old
how_old 用的是eclipse,好心酸。。
大约 2 年之前 回复
lxk_1993
lxk_1993   Rxr 2016.05.10 10:00
 public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private int tvLeft, tvRight, tvTop, tvBottom;
    private boolean first = true;
    private int startX,startY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.test);

        textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startX = (int) event.getRawX();
                        startY = (int) event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        textView.layout(
                                (int) (tvLeft + event.getRawX() - startX),
                                (int) (tvTop + event.getRawY() - startY),
                                (int) (tvRight + event.getRawX() - startX),
                                (int) (tvBottom + event.getRawY() - startY));
                        break;
                    case MotionEvent.ACTION_UP:
//                        TranslateAnimation translateAnimation = new TranslateAnimation(tvLeft, tvTop, tvRight, tvBottom);
//                        translateAnimation.setDuration(1000);
//                        textView.setAnimation(translateAnimation);
                        textView.layout(tvLeft, tvTop, tvRight, tvBottom);
                        break;
                }
                return true;
            }
        });

    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && first) {
            tvLeft = textView.getLeft();
            tvTop = textView.getTop();
            tvRight = textView.getRight();
            tvBottom = textView.getBottom();
            first = false;
            textView.setText(tvLeft + "," + tvTop + "," + tvRight + "," + tvBottom);
        }
    }
}
lxk_1993
lxk_1993   Rxr 2016.05.10 10:22
public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private int tvLeft, tvRight, tvTop, tvBottom;
    private boolean first = true;
    private int startX, startY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.test);

        textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startX = (int) event.getRawX();
                        startY = (int) event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        textView.layout(
                                (int) (tvLeft + event.getRawX() - startX),
                                (int) (tvTop + event.getRawY() - startY),
                                (int) (tvRight + event.getRawX() - startX),
                                (int) (tvBottom + event.getRawY() - startY));
                        break;
                    case MotionEvent.ACTION_UP:
                        AnimatorSet set = new AnimatorSet();
                        set.playTogether(
                                ObjectAnimator.ofFloat(textView, "translationX", tvLeft - textView.getLeft()),
                                ObjectAnimator.ofFloat(textView, "translationY", tvTop - textView.getTop())
                        );
                        set.setDuration(2000).start();
                        break;
                }
                return true;
            }
        });

    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && first) {
            tvLeft = textView.getLeft();
            tvTop = textView.getTop();
            tvRight = textView.getRight();
            tvBottom = textView.getBottom();
            first = false;
            textView.setText(tvLeft + "," + tvTop + "," + tvRight + "," + tvBottom);
        }
    }
}

lxk_1993
lxk_1993   Rxr 2016.05.10 10:34

加在 textView = (TextView) findViewById(R.id.test); 下面

        if (first){
            textView.post(new Runnable() {
                @Override
                public void run() {
                    tvLeft = textView.getLeft();
                    tvTop = textView.getTop();
                    tvRight = textView.getRight();
                    tvBottom = textView.getBottom();
                    first = false;
                    textView.setText(tvLeft + "," + tvTop + "," + tvRight + "," + tvBottom);
                }
            });
        }

lxk_1993
lxk_1993   Rxr 2016.05.10 10:41

这样基本实现了 你再优化下吧

 public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private int tvLeft, tvRight, tvTop, tvBottom;
    private int Left, Right, Top, Bottom;
    private boolean first = true;
    private int startX, startY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.test);


        if (first){
            textView.post(new Runnable() {
                @Override
                public void run() {
                    tvLeft = textView.getLeft();
                    tvTop = textView.getTop();
                    tvRight = textView.getRight();
                    tvBottom = textView.getBottom();
                    first = false;
                    textView.setText(tvLeft + "," + tvTop + "," + tvRight + "," + tvBottom);
                }
            });
        }


        textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startX = (int) event.getRawX();
                        startY = (int) event.getRawY();
                        Left = textView.getLeft();
                        Top = textView.getTop();
                        Right = textView.getRight();
                        Bottom = textView.getBottom();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        textView.layout(
                                (int) (Left + event.getRawX() - startX),
                                (int) (Top + event.getRawY() - startY),
                                (int) (Right + event.getRawX() - startX),
                                (int) (Bottom + event.getRawY() - startY));
                        break;
                    case MotionEvent.ACTION_UP:
                        AnimatorSet set = new AnimatorSet();
                        set.playTogether(
                                ObjectAnimator.ofFloat(textView, "translationX", tvLeft - textView.getLeft()),
                                ObjectAnimator.ofFloat(textView, "translationY", tvTop - textView.getTop())
                        );
                        set.setDuration(2000).start();

                        textView.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                textView.layout(textView.getLeft(), textView.getTop(), textView.getRight(), textView.getBottom());
                            }
                        }, 2000);

                        break;
                }
                return true;
            }
        });

    }
}
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
自定义ViewSwitcher实现分屏及切换动画效果,解决GridView的onTouch与onItemClick事件冲突
自定义ViewSwitcher实现分屏及切换动画效果,利用Gesture Detector解决GridView的onTouch与onItemClick事件冲突
Android中GridView中onTouch监听(1)item实现触摸执行缩放动画的功能
功能:当用户点击元素,执行图片缩放动画,当按住元素并且移开位置离开该元素,之前元素将执行放大回到原状,而新选中的元素将进行缩放。 即:gridview中的元素按住就会下陷变小,移动离开就会变回原样,点击就会进入跳转界面 由于为了完整的监听ontouch事件,即能监听ACTION_DOWN,MOVE,UP返回值必须为true 但是由于为true导致事件被拦截了,之后的自带的onItemClic
android onClick 与 onTouch 的区别
最近在项目中做一个时间选择框的功能,功能是这样的,有一个EditText,只要点击它就弹出一个DatePicker选择日期,选中的日期赋值给EditText。 第一反应,是觉得这个事件就是只要“碰到” EditText (不管哪个位置)就弹出框,于是直觉就是用 onTouch 事件。 但是结果很奇怪,运行的时候,手指碰了一下文本框,时间框是弹了出来,但是之后又闪烁了两下,好像是又重新弹了两次;
Android系统中View的onTouchEvent和OnTouch区别
以自定义的TestButton为例。 我们可以通过重写onTouchEvent方法来处理诸如down move up的消息: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class TestButton extends Button {
Android onTouch 执行过程 和onClick 发生冲突的解决办法
今天在做项目的时候遇到一个问题,就是怎么让ListView中的item点击后其内部的内容跟着变色,比如现在我的item布局中有一个TextView,现在点击item的时候,让其背景色发生改变,这个我们可以为item布局背景定义一个selctor.xml就可以了,但是现在的问题是item内容布局中的TextView中的内容也要跟着变色,这个立马想到了触摸监听器onTouch方法,只需要在ACTION
Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法
今天在做项目的时候遇到一个问题,就是怎么让ListView中的item点击后其内部的内容跟着变色,比如现在我的item布局中有一个TextView,现在点击item的时候,让其背景色发生改变,这个我们可以为item布局背景定义一个selctor.xml就可以了,但是现在的问题是item内容布局中的TextView中的内容也要跟着变色,这个立马想到了触摸监听器onTouch方法,只需要在ACTION
Android中onClick事件和onTouchEvent事件冲突问题的解决方案
onClick事件和onTouchEvent 方法冲突的解决方案
如何解决ViewFlipper的onClick和onTouch的冲突事件
前段时间一直在做一个新功能--状态栏的快捷方式如下图所示: 通知界面和开关界面进行切换时用到了ViewFlipper,但是有一个比较棘手的问题,效果要做到既能通过手势来翻页切换图片,而且ImageView还需要设置点击事件,程序出现如下问题:要不就是OnClick事件把OnTouch事件拦截了,不执行ViewFlipper的OnTouch事件,要不就是ViewFlipper的OnTouch
Android通过onTouch事件实现单击,双击,长按
一般采用延时做法。 private int mClickcount; // 点击次数 private int mDownX; private int mDownY; private int mMoveX; private int mMoveY; private int mUpX; private int mUpY; private long mLastDownTim
android 可拖动控件 ontouchevent
Android MotionEvent详解 字数2398 阅读2990 评论14 喜欢38  在前边几篇博文中(《图解Android事件传递之ViewGroup篇》,《图解Android事件传递之View篇》),我们已经了解了android触摸事件传递机制,接着我们再来研究一下与触摸事件传递相关的几个比较重要的类,比如MotionEvent。我们今天就来详细说明一下这个类的各方面用