ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[安卓/Android] 仿微信拍一拍功能实现及代码

2020-06-29 19:03:50  阅读:413  来源: 互联网

标签:val 安卓 long param call private Android 仿微信 震动


主要介绍拍一拍图标的实现以及应用。

注:为了偷懒,圆形ImageView用的是我自己的一个ShapeImageView控件实现的,以及RecyclerView的适配器,

这些都封装在libs下的aar包里边。

底部有传送门 。

<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="jCFykOUa-1593260108608" src="https://player.bilibili.com/player.html?aid=626170270"></iframe>

视频展示

 

1.图标抖动

//摆幅动画
private ValueAnimator mValAnim;
//摆幅大小
private float mPatPower = 8;
//摆幅次数
private int mPatCount = 3;
//震动时间
private long[] mVibratorTimings = new long[] { 0, 50, 150, 50 };

public void init() {
    mValAnim = new ValueAnimator();
    //动画更新事件监听器
    mValAnim.addUpdateListener(anim -> {
        float val = (float) anim.getAnimatedValue();
        //左右旋转
        setRotation( val );
        //左右移动
        setTranslationX( val );
    });
}

/**
 * 构建设置
 */
public void build() {
     loat[] val = new float[ ( mPatCount * 2 ) + 1 ];
    for (int i = 0; i < val.length; i++) {
        if( i < val.length - 1 ) {
            //左右摆幅( -5, 5, -5, 5 )
            val[ i ] = i % 2 == 0 ? -mPatPower : mPatPower;
        }else {
            //最后一帧复位
            val[ i ] = 0;
        }
    }
   mValAnim.setFloatValues( val );
}

/**
 * 拍一拍
 */
public void startPat() {
    //拍一拍动画
    mValAnim.start();
    //设置震动
    Utils.startVibrator( getContext(), -1, mVibratorTimings );
}

2.双击

private static long firstTime = 0;

/**
 * 双击操作
 * @param time    间隔时间
 * @param call    回调。false:第一次单击,true:双击
 */
public static void doubleTouch(long time, Consumer<Boolean> call) {
    long secondTime = System.currentTimeMillis();
    if( secondTime - firstTime > time ) {
        firstTime = secondTime;
        //第一次通知
        if( call != null ) call.accept( false );
    } else {
        //第二次通知
        if( call != null ) call.accept( true );
    }
}

3.3D震动

在manifest清单中添加震动权限
<!-- 震动权限 -->
<uses-permission android:name="android.permission.VIBRATE" />

/**
 * 开始震动
 * @param context       上下文
 * @param repeat        循环次数。-1:仅一次
 * @param timings       [0]:震动延迟、[1]:震动时长、[2]:震动延迟、[3]:震动时长...
 */
public static void startVibrator(@NonNull Context context, int repeat, long... timings) {
    Vibrator v = (Vibrator) context.getSystemService( Context.VIBRATOR_SERVICE );
    if( v == null ) return;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        v.vibrate( VibrationEffect.createWaveform( timings, repeat ) );
    }else {
        v.vibrate( timings, repeat );
    }
}

4.拍一拍间隔

//间隔时长
private long mIntervalMillis = 5000;
//当前间隔
private long mCurrentMillis = 0;

/**
 * 间隔检查
 * @return      间隔是否超时
 */
private boolean checkInterval() {
    if( mIntervalMillis <= 0 ) return true;
    //间隔时间初始化
    if( mCurrentMillis == 0 ) mCurrentMillis = System.currentTimeMillis() - mIntervalMillis;
    //在间隔时间内
    if( mCurrentMillis + mIntervalMillis > System.currentTimeMillis() ) {
        return false;
    }
    mCurrentMillis = System.currentTimeMillis();
    return true;
}

Demo传送门:拍一拍Demo

拍一拍控件传送门:PatView

ShapeImageView传送门:ShapeImageView

Adapter传送门:BaseRecyclerViewAdapter

标签:val,安卓,long,param,call,private,Android,仿微信,震动
来源: https://blog.csdn.net/u013599928/article/details/106987389

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有