java,public class LineView extends View {, private Paint paint;, private float startX = 0, startY = 0, endX = 100, endY = 100;, private long duration = 2000; // 2秒, private long startTime;,, public LineView(Context context) {, super(context);, init();, },, public LineView(Context context, AttributeSet attrs) {, super(context, attrs);, init();, },, private void init() {, paint = new Paint();, paint.setColor(Color.BLACK);, paint.setStrokeWidth(5);, },, @Override, protected void onDraw(Canvas canvas) {, super.onDraw(canvas);, if (startTime == 0) {, startTime = System.currentTimeMillis();, }, long elapsed = System.currentTimeMillis() startTime;, float fraction = Math.min(elapsed / (float) duration, 1);, float currentX = startX + (endX startX) * fraction;, float currentY = startY + (endY startY) * fraction;, canvas.drawLine(startX, startY, currentX, currentY, paint);, if (fraction``,,这个自定义View会在2秒内从起点(0,0)到终点(100,100)画一条直线。
在Android开发中,自定义View是一种强大的工具,可以用来实现各种复杂的UI效果,本文将介绍如何使用自定义View在指定时间内匀速画一条直线的实例代码,我们将通过以下步骤来实现这个功能:
1、创建自定义View类
2、初始化画笔和路径
3、计算动画参数
4、使用ValueAnimator实现动画
5、在Activity中使用自定义View
创建自定义View类
我们需要创建一个自定义View类,继承自View
,在这个类中,我们将定义一些必要的属性和方法。
package com.example.customview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.view.View; public class LineDrawingView extends View { private Paint paint; private Path path; private float startX, startY, endX, endY; private float currentX, currentY; private long duration = 2000; // 动画持续时间,单位为毫秒 public LineDrawingView(Context context) { super(context); init(); } public LineDrawingView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public LineDrawingView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { paint = new Paint(); paint.setColor(0xFF000000); // 设置画笔颜色为黑色 paint.setStrokeWidth(5); // 设置画笔宽度 paint.setStyle(Paint.Style.STROKE); // 设置画笔样式为描边 path = new Path(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(path, paint); } public void setLineCoordinates(float startX, float startY, float endX, float endY) { this.startX = startX; this.startY = startY; this.endX = endX; this.endY = endY; this.currentX = startX; this.currentY = startY; path.reset(); path.moveTo(startX, startY); } public void startAnimation() { ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); animator.setDuration(duration); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float fraction = (float) animation.getAnimatedValue(); currentX = startX + (endX startX) * fraction; currentY = startY + (endY startY) * fraction; path.lineTo(currentX, currentY); invalidate(); // 重绘View } }); animator.start(); } }
初始化画笔和路径
在自定义View类的构造方法中,我们初始化了画笔和路径对象,并设置了画笔的颜色、宽度和样式,这些属性可以根据需要进行调整。
计算动画参数
在setLineCoordinates
方法中,我们设置了直线的起点和终点坐标,并重置了路径对象,在startAnimation
方法中,我们使用ValueAnimator
来计算动画过程中的当前坐标,并更新路径。
4. 使用ValueAnimator实现动画
ValueAnimator
用于在指定的时间范围内生成一系列值,这里我们使用它来生成从0到1的浮点数,表示动画的进度,在每次更新时,我们根据进度计算当前的坐标,并调用invalidate
方法重绘View。
5. 在Activity中使用自定义View
我们在Activity中使用自定义View,并启动动画,以下是一个简单的Activity示例:
package com.example.customview; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LineDrawingView lineDrawingView = findViewById(R.id.lineDrawingView); lineDrawingView.setLineCoordinates(100, 100, 800, 800); // 设置起点和终点坐标 lineDrawingView.startAnimation(); // 启动动画 } }
在布局文件activity_main.xml
中,我们需要添加自定义View:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.customview.LineDrawingView android:id="@+id/lineDrawingView" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
通过以上步骤,我们实现了一个自定义View,能够在指定时间内匀速画一条直线,这个例子展示了如何使用ValueAnimator
来实现动画效果,并通过重绘View来更新显示内容,你可以根据需要进一步扩展和优化这个自定义View,例如添加更多的动画效果或交互功能。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1263344.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复