package com.goach.love.view;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.support.graphics.drawable.VectorDrawableCompat;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import com.goach.love.R;
import com.goach.love.utils.LoveEvaluator;
import java.util.Random;
/**
* Created by 钟光新 on 2016/7/1 0001.
*/
public class LoveAnimView extends ImageView implements ValueAnimator.AnimatorUpdateListener{
private Point mStartPoint;
private Point mEndPoint;
private int[] colors = new int[]{Color.YELLOW,Color.BLACK,Color.BLUE,Color.RED,Color.GREEN};
public LoveAnimView(Context context) {
this(context,null);
}
public LoveAnimView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public LoveAnimView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
VectorDrawableCompat a = VectorDrawableCompat.create(getResources(), R.drawable.love_drawable,
getResources().newTheme());
Random random = new Random();
int round = random.nextInt(5);
a.setTint(colors[round]);
//DrawableCompat.setTint(a,colors[round]);
VectorDrawableCompat boardVdc = VectorDrawableCompat.create(getResources(), R.drawable.border_drawable,
getResources().newTheme());
Drawable[] drawable = new Drawable[2];
drawable[0] = a;
drawable[1] = boardVdc;
LayerDrawable layerDrawable = new LayerDrawable(drawable);
setImageDrawable(layerDrawable);
}
public void setStartPosition(Point startPosition) {
startPosition.y -= 10;
this.mStartPoint = startPosition;
}
public void setEndPosition(Point endPosition) {
this.mEndPoint = endPosition;
}
public void startLoveAnimation(){
if(mStartPoint==null||mEndPoint==null)
throw new IllegalArgumentException("mStartPoint is not null or mEndPoint is not null");
int dirPointX = (int)(Math.random()*330);
int dirPointY = (mStartPoint.y+mEndPoint.y)/2;
Point dirPoint = new Point(dirPointX,dirPointY);
LoveEvaluator loveEvaluator = new LoveEvaluator(dirPoint);
ValueAnimator animator = ValueAnimator.ofObject(loveEvaluator,mStartPoint,mEndPoint);
animator.addUpdateListener(this);
animator.setDuration(2000);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
ViewGroup viewGroup = (ViewGroup) getParent();
setAlpha(0f);
viewGroup.removeView(LoveAnimView.this);
}
});
animator.setInterpolator(new LinearInterpolator());
animator.start();
}
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
Point point = (Point) valueAnimator.getAnimatedValue();
setX(point.x);
setY(point.y);
float value = point.y*1.0f/mStartPoint.y;
setAlpha(value);
invalidate();
}
}
在Android开发中,实现类似映客直播中的点亮功能是一项有趣且具有挑战性的任务。这个功能通常涉及到了图形绘制和动画的结合,使用户界面更加生动和互动。本篇将深入探讨如何利用`VectorDrawable`和`PropertyAnimation`来实现这样的效果。 `VectorDrawable`是Android提供的一种用于在应用程序中使用矢量图形的方式。相比于传统的`BitmapDrawable`,它具有清晰、无像素失真、适应不同屏幕分辨率等优点。在我们的案例中,我们可以创建一个代表点亮图标的心形`VectorDrawable`资源,定义其初始状态为未点亮,然后通过动画改变其状态为点亮。 `VectorDrawable`的XML定义通常位于`res/drawable`目录下,例如: ```xml <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:name="heart_path" android:pathData="...(心形路径数据)..." android:fillColor="#000000"/> </vector> ``` 接下来,我们将使用`PropertyAnimation`来改变`VectorDrawable`的状态。`PropertyAnimation`是Android的动画系统之一,它允许开发者对对象的属性进行平滑过渡。在这种情况下,我们可以改变`VectorDrawable`的`fillColor`属性,使其从未点亮的透明色逐渐变为点亮的亮色,如红色。 有两种主要的`PropertyAnimation`实现方式:`ValueAnimator`和`ObjectAnimator`。对于简单属性动画,如颜色变化,`ObjectAnimator`更方便: ```java ObjectAnimator animator = ObjectAnimator.ofObject( imageView, // 使用VectorDrawable的ImageView "tint", // 属性名 new ArgbEvaluator(), // 颜色值转换器 Color.TRANSPARENT, // 起始颜色 ContextCompat.getColor(context, R.color.heart_color)) // 结束颜色 animator.setDuration(500); // 动画时长 animator.start(); // 开始动画 ``` 在这个例子中,`imageView`是显示`VectorDrawable`的`ImageView`,我们通过改变其`tint`属性来实现颜色动画。`ArgbEvaluator`是一个颜色值评估器,它会根据动画进度线性插值计算中间颜色。 为了使动画效果更具交互性,我们可能需要监听用户的触摸事件,当用户点击图标时触发动画。这可以通过在`OnClickListener`中启动动画来实现: ```java imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isAnimating) { // 防止重复启动动画 isAnimating = true; // 启动动画 } } }); ``` 此外,为了保持动画的连贯性,可以添加一个回调来监听动画结束,并重置`isAnimating`标志。 总结来说,实现“高仿映客直播点亮功能”需要结合`VectorDrawable`的图形绘制能力和`PropertyAnimation`的动态效果。通过精心设计的矢量图和巧妙的动画逻辑,可以创造出引人注目的用户界面元素,增强用户体验。在实际开发中,还可以考虑兼容Android的不同版本以及性能优化等问题,以确保功能的稳定性和效率。






































































































































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- 有_缘_人2017-01-12很不错的例子!
- ffwwtt2017-08-13很不错的例子!

- 粉丝: 99
- 资源: 14
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 智能家居_HomeAssistant_实战篇_教程文档_1741166831.zip
- 智能家居_知识集成_家庭管理_便捷生活_1741167623.zip
- 智能硬件_蓝牙键盘_多功能_控制系统_1741167267.zip
- sudo-wang_SmartHome_1741166971.zip
- 智能家居_IoT_MQTT_毕业设计_1741166964.zip
- VincentAzz_SmartHomeDashboard_1741167148.zip
- liar177_graduation_project_for_1741167072.zip
- 智能家居_开源软硬件系统_wumei-iot_学习与开发_1741167439.zip
- 智能家居_Zigbee_Android_管理控制系统_1741167232.zip
- guidons-master_HomeRPC_1741167209.zip
- 智能家居_语音交互_小蓝机器人_开源项目_1741166927.zip
- Java虚拟机-JVM面试题八股文PDF
- Maxscript实现小球碰撞反弹动画脚本源码下载
- 三菱FX PLC与变频器Modbus通讯实现设备控制与系统监测一体化,昆仑通态MCGS触摸屏辅助操作,功能多样适应性强 ,三菱PLC与三菱变频器Modbus通讯实用方案:采用FX1N PLC 485与
- 三菱PLC以太网通讯库与LabVIEW通讯库结合,三菱PLC以太网通讯MC 3E帧协议下的Labview通讯库设计与实现,三菱PLC 以太网通讯MC 3E帧协议labview通讯库 ,三菱PLC;
- 电信行业AI现状:2024年中国趋势调查报告


