【安卓笔记】view触摸缩放

view触摸缩小,抬起恢复

请添加图片描述

使用方法

mBinding.view.setOnTouchListener(new ViewTouchUitl());

java代码

ViewTouchUitl

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.view.View;
import android.view.animation.ScaleAnimation;
import android.view.animation.Animation;
import android.view.animation.AccelerateDecelerateInterpolator;

public class TouchFeedback {
    
    
    /**
     * 缩放动画的单方面时长,假如是100,是指放大100,当手指离开缩小又是100.
     */
    private int duration = 333;
    /**
     * 放大或者缩小的值
     */
    private float aFloatBig = 0.9f;

    /**
     * 可以自己设定
     *
     * @param duration
     * @param aFloatBig
     */
    public void setDurationAndFloatBig(int duration, float aFloatBig) {
        this.duration = duration;
        this.aFloatBig = aFloatBig;
    }

    /**
     * 私有构造
     */
    private TouchFeedback() {
    }

    /**
     * 定义回调的接口
     */
    public interface TouchFeedbackListener {
        void onFeedback(View view);
    }

    private static TouchFeedback touchFeedback = null;

    public static TouchFeedback getTouchFeedbackInstance() {
        if (touchFeedback == null) {
            synchronized (TouchFeedback.class) {
                if (touchFeedback == null) {
                    touchFeedback = new TouchFeedback();
                }
            }
        }
        return touchFeedback;
    }

   

    /**
     * 恢复原形的动画
     * @param v
     * @param b
     * @param touchFeedListener
     */
    public void scaleSmall(final View v, boolean b) {
        ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(v, "ScaleX", aFloatBig, 1f).setDuration(duration);
        ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(v, "ScaleY", aFloatBig, 1f).setDuration(duration);
        objectAnimator2.start();
        objectAnimator3.start();
        if (b) {
            /**动画执行的监听**/
            objectAnimator2.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {

                    }

                    /**
                     * 动画结束
                     * @param animation
                     */
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });
        }


    }

    /**
     * 变大的动画
     * @param v
     */
    public void scaleBig(View v) {
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v, "ScaleX", 1f, aFloatBig).setDuration(duration);
        ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(v, "ScaleY", 1f, aFloatBig).setDuration(duration);
        objectAnimator.start();
        objectAnimator1.start();
    
    }
	public void executeAnimation(View view) {
        ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.95f, 1.0f, 0.95f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnimation.setDuration(100);
        scaleAnimation.setRepeatCount(1);
        scaleAnimation.setRepeatMode(Animation.REVERSE);
        scaleAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
        view.startAnimation(scaleAnimation);
    }
    
}

ViewTouchUitl


import android.view.MotionEvent;
import android.view.View;

public class ViewTouchUitl implements View.OnTouchListener {



    /**
     * 缩放动画的单方面时长,假如是100,是指放大100,当手指离开缩小又是100.
     */
    private int duration = 100;
    /**
     * 放大或者缩小的值
     */
    private float aFloatBig = 0.9f;


    private TouchFeedback mTouchFeedback =  TouchFeedback.getTouchFeedbackInstance();


    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                mTouchFeedback.scaleBig(v);                       

                break;
            case MotionEvent.ACTION_MOVE:      

                break ;


            case MotionEvent.ACTION_UP:
                if(isOutterUp(event,v)){
                    event.setAction(MotionEvent.ACTION_CANCEL);                              
                    return onTouch(v,event);
                }             
                mTouchFeedback.scaleSmall(v, true);
                v.performClick();
                //  v.setSelected(false);
                break;
            case MotionEvent.ACTION_CANCEL:
                mTouchFeedback.scaleSmall(v, false);

                break;

        }
        return true;
    }


    private boolean isOutterUp(MotionEvent event, View v) {
        float touchX = event.getX();
        float touchY = event.getY();
        float maxX = v.getWidth();
        float maxY = v.getHeight();

        return touchX<0 || touchX>maxX || touchY < 0 || touchY > maxY;
    }
}

kotlin代码

import android.animation.Animator
import android.animation.ObjectAnimator
import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator
import android.view.animation.Animation
import android.view.animation.ScaleAnimation


/**
 * @Description:
 * @Author: JIULANG
 * @Data: 2022/5/12 18:43
 */
object TouchFeedback {
    /**
     * 缩放动画的单方面时长,假如是100,是指放大100,当手指离开缩小又是100.
     */
    private var duration = 333L

    /**
     * 放大或者缩小的值
     */
    private var aFloatBig = 0.9f

    /**
     * 可以自己设定
     *
     * @param duration
     * @param aFloatBig
     */
    fun setDurationAndFloatBig(duration: Long, aFloatBig: Float) {
        this.duration = duration
        this.aFloatBig = aFloatBig
    }

    /**
     * 定义回调的接口
     */
    interface TouchFeedbackListener {
        fun onFeedback(view: View?)
    }

    /**
     * 恢复原形的动画
     * @param v
     * @param b
     * @param touchFeedListener
     */
    fun scaleSmall(v: View?, b: Boolean) {
        val objectAnimator2 = ObjectAnimator.ofFloat(v, "ScaleX", aFloatBig, 1f).setDuration(
            duration
        )
        val objectAnimator3 = ObjectAnimator.ofFloat(v, "ScaleY", aFloatBig, 1f).setDuration(
            duration
        )
        objectAnimator2.start()
        objectAnimator3.start()
        if (b) {
            /**动画执行的监听 */
            objectAnimator2.addListener(object : Animator.AnimatorListener {
                override fun onAnimationStart(animation: Animator?) {}

                /**
                 * 动画结束
                 * @param animation
                 */
                override fun onAnimationEnd(animation: Animator?) {}
                override fun onAnimationCancel(animation: Animator?) {}
                override fun onAnimationRepeat(animation: Animator?) {}
            })
        }
    }

    /**
     * 变大的动画
     * @param v
     */
    fun scaleBig(v: View?) {
        val objectAnimator = ObjectAnimator.ofFloat(v, "ScaleX", 1f, aFloatBig).setDuration(
            duration.toLong()
        )
        val objectAnimator1 = ObjectAnimator.ofFloat(v, "ScaleY", 1f, aFloatBig).setDuration(
            duration.toLong()
        )
        objectAnimator.start()
        objectAnimator1.start()
    }

    fun executeAnimation(view: View) {
        val scaleAnimation = ScaleAnimation(
            1.0f,
            0.95f,
            1.0f,
            0.95f,
            Animation.RELATIVE_TO_SELF,
            0.5f,
            Animation.RELATIVE_TO_SELF,
            0.5f
        )
        scaleAnimation.duration = 100
        scaleAnimation.repeatCount = 1
        scaleAnimation.repeatMode = Animation.REVERSE
        scaleAnimation.interpolator = AccelerateDecelerateInterpolator()
        view.startAnimation(scaleAnimation)
    }
}

import android.view.MotionEvent
import android.view.View


/**
 * @Description:
 * @Author: JIULANG
 * @Data: 2022/5/12 18:44
 */
object TouchFeedbackUitl : View.OnTouchListener {
    /**
     * 缩放动画的单方面时长,假如是100,是指放大100,当手指离开缩小又是100.
     */
    private val duration = 100

    /**
     * 放大或者缩小的值
     */
    private val aFloatBig = 0.9f
    private val mTouchFeedback= TouchFeedback
    override fun onTouch(v: View, event: MotionEvent): Boolean {
        when (event.action) {
            MotionEvent.ACTION_DOWN -> mTouchFeedback.scaleBig(v)
            MotionEvent.ACTION_MOVE -> {
            }
            MotionEvent.ACTION_UP -> {
                if (isOutterUp(event, v)) {
                    event.action = MotionEvent.ACTION_CANCEL
                    return onTouch(v, event)
                }
                mTouchFeedback.scaleSmall(v, true)
                v.performClick()
            }
            MotionEvent.ACTION_CANCEL -> mTouchFeedback.scaleSmall(v, false)
        }
        return true
    }

    private fun isOutterUp(event: MotionEvent, v: View): Boolean {
        val touchX = event.x
        val touchY = event.y
        val maxX: Int = v.width
        val maxY: Int = v.height
        return touchX < 0 || touchX > maxX || touchY < 0 || touchY > maxY
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340