Point类android.graphics.Point

本文深入探讨了点对象类的功能特性,包括坐标设定、补偿与坐标否定等核心方法,同时与PointF类进行了对比,展示了不同坐标类型的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个类从字面意思就可以看出它跟点有关系,是点的一个对象类。 

这个类有两个属性,分别是:X坐标和y坐标。 

构造函数有三个:Point(),Point(int x,int y),Point(Point p) 

主要方法有: 

Public void set(x,y);重新设定一下x,y的坐标 

Public final void offset(int dx,int dy);给坐标一个补偿值,值可以使正的也可以是负的。 

Public final void negate();否定坐标值。 

Point类和android.graphics.PointF类似,不同点是前者坐标值的类型是int型,而后者的坐标值是float型。除此之外PointF类多加了几个方法,比如: 

Public final float length();返回(0,0)点到该点的距离。 

Public static float length(float x,float y);返回(0,0)点到(x,y)点的距离。 


转载自:http://byandby.iteye.com/blog/826304

import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Camera; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Shader; import android.util.AttributeSet; import android.view.View; import android.view.animation.LinearInterpolator; import androidx.annotation.Nullable; import java.util.ArrayList; import java.util.List; /** * @Description: 网格线 * @Author: alex * @CreateDate: 2025/7/9 16:03 */ public class LyricGridView extends View { private Paint gridPaint; private Paint controlPointPaint; private Path gridPath; private int gridSize = 100; // 网格尺寸 (行数和列数) private LinearGradient gradient; private List<PointF> controlPoints = new ArrayList<>(); private List<Boolean> randomizedPoints = new ArrayList<>(); private float rotationAngle = 15f; // 网格旋转角度(度) private float floatAmplitude = 20f; // 浮动幅度 private float floatPhase = 0f; // 浮动相位 private ValueAnimator floatAnimator; // 浮动动画控制器 Camera camera = new Camera(); Matrix canvasMatrix = new Matrix(); public LyricGridView(Context context) { super(context); init(); } public LyricGridView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } private void init() { // 网格线画笔设置 gridPaint = new Paint(Paint.ANTI_ALIAS_FLAG); gridPaint.setStyle(Paint.Style.STROKE); gridPaint.setStrokeWidth(1f); gridPaint.setColor(Color.parseColor("#80FFFFFF")); // 半透明白色 // 控制点画笔设置 controlPointPaint = new Paint(Paint.ANTI_ALIAS_FLAG); controlPointPaint.setStyle(Paint.Style.FILL); controlPointPaint.setColor(Color.parseColor("#cccccc")); gridPath = new Path(); // 初始化浮动动画 setupFloatAnimation(); } private void setupFloatAnimation() { floatAnimator = ValueAnimator.ofFloat(0, 2 * (float) Math.PI); floatAnimator.setDuration(5000); // 3秒完成一个完整周期 floatAnimator.setRepeatCount(ValueAnimator.INFINITE); floatAnimator.setInterpolator(new LinearInterpolator()); floatAnimator.addUpdateListener(animation -> { floatPhase = (float) animation.getAnimatedValue(); invalidate(); // 触发重绘 }); floatAnimator.start(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // 设置渐变的方向是从右到左 gradient = new LinearGradient( w, 0, // 起始点(右侧) 0, 0, // 结束点(左侧) Color.parseColor("#cccccc"), Color.parseColor("#00000000"), // 黑色 -> 透明 Shader.TileMode.CLAMP ); // 更新画笔的着色器 gridPaint.setShader(gradient); generateControlPoints(w, h); buildBezierGrid(w, h); } private void generateControlPoints(int width, int height) { controlPoints.clear(); randomizedPoints.clear(); // 清空随机标记 float cellWidth = width / (float) gridSize; float cellHeight = height / (float) gridSize; // 生成网格点并添加随机偏移作为贝塞尔控制点 for (int row = 0; row <= gridSize; row++) { for (int col = 0; col <= gridSize; col++) { float x = col * cellWidth; float y = row * cellWidth; // 添加随机偏移(实际应用中可替换为自定义控制点) float offsetX = (float) (Math.random() * 10 - 5); float offsetY = (float) (Math.random() * 10 - 5); boolean isRandomized = false; // 边界约束 if (col == 0 || col == gridSize) offsetX = 0; if (row == 0 || row == gridSize) offsetY = 0; // 只有50%的点会被随机偏移 if (Math.random() > 0.95) { isRandomized = true; } offsetY = 0; offsetX = 0; controlPoints.add(new PointF(x + offsetX, y + offsetY)); randomizedPoints.add(isRandomized); // 记录随机状态 } } } private void buildBezierGrid(int width, int height) { gridPath.reset(); // 绘制横向曲线 for (int row = 0; row <= gridSize; row++) { for (int col = 0; col < gridSize; col++) { int index = row * (gridSize + 1) + col; PointF start = controlPoints.get(index); PointF end = controlPoints.get(index + 1); if (col == 0) { gridPath.moveTo(start.x, start.y); } gridPath.lineTo(end.x, end.y); } } // 绘制纵向曲线 for (int col = 0; col <= gridSize; col++) { for (int row = 0; row < gridSize; row++) { int index = row * (gridSize + 1) + col; PointF start = controlPoints.get(index); PointF end = controlPoints.get(index + gridSize + 1); if (row == 0) { gridPath.moveTo(start.x, start.y); } gridPath.lineTo(end.x, end.y); } } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 保存当前画布状态 canvas.save(); // 计算浮动偏移量 (使用正弦函数创造波浪效果) float floatOffset = floatAmplitude * (float) Math.sin(floatPhase * 0.5f); // 计算中心点坐标 float centerX = getWidth() / 2f; float centerY = getHeight() / 2f; camera.save(); camera.rotateX(40f); camera.getMatrix(canvasMatrix); camera.restore(); // 应用3D旋转(保持水平位置不变) canvasMatrix.preTranslate(-centerX, 0); canvasMatrix.postTranslate(centerX, 0); // 应用3D变换到Canvas canvas.concat(canvasMatrix); // 应用旋转变换(以中心点为轴心) // canvas.rotate(rotationAngle, centerX, centerY); canvas.translate((getWidth() / (float) gridSize) * 10, -(getWidth() / (float) gridSize) * 8); canvas.translate(floatOffset, 0); // 添加垂直浮动 // 绘制贝塞尔曲线网格 gridPaint.setAlpha(150); // 增加透明度 canvas.drawPath(gridPath, gridPaint); // // 绘制控制点(可选) // for (PointF point : controlPoints) { // canvas.drawCircle(point.x, point.y, 4, controlPointPaint); // } // 获取屏幕宽度的一半 float screenHalf = getWidth() / 3f; // 只绘制被随机偏移的控制点 for (int i = 0; i < controlPoints.size(); i++) { PointF point = controlPoints.get(i); if (randomizedPoints.get(i) && point.x > screenHalf) { // 只绘制被随机偏移的点 canvas.drawCircle(point.x, point.y, 1, controlPointPaint); } } // 恢复画布状态 canvas.restore(); } // 设置网格密度 public void setGridSize(int size) { this.gridSize = Math.max(2, size); requestLayout(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (floatAnimator != null) { floatAnimator.cancel(); } } public void setDrawingEnabled(boolean enabled) { if (enabled) { setVisibility(VISIBLE); if (floatAnimator != null && !floatAnimator.isRunning()) { setupFloatAnimation(); } } else { setVisibility(GONE); if (floatAnimator != null) { floatAnimator.cancel(); } } } } 3d旋转后网格变形的原因
最新发布
07-13
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值