<Path>类

本文介绍如何在Android中利用Path类实现复杂图形绘制,并通过PathEffect应用多种视觉效果,如CornerPathEffect、DiscretePathEffect等,同时展示了如何通过动画效果增强用户体验。

Android 提供的Path 类时一个非常有用的类.它可以预先在View 上将N个点连成一个”路径”,然后调用Canvas 的DrawPath(path , paint)即可沿着路径绘制图形.


package com.test.pathactivity;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ComposePathEffect;
import android.graphics.CornerPathEffect;
import android.graphics.DashPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathDashPathEffect;
import android.graphics.PathEffect;
import android.graphics.SumPathEffect;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.View;

public class PathActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_path);
        setContentView(new MyView(this));
    }

    class MyView extends View{

        float phase;
        PathEffect[] mEffects = new PathEffect[7];
        int[] colors;

        private Paint mPaint;
        Path path;


        public MyView(Context context) {
            super(context);
            mPaint = new Paint();

            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(5);


            //创建并初始化 Path
            path = new Path();
            path.moveTo(0,0);

            for (int i = 0; i <= 15 ; i++) {
                //生成 15个点,随机生成他们的 y坐标 并将他们连成一个 path
                path.lineTo(i*30, (float) (Math.random()*60));
            }

            //初始化7个颜色
            colors = new int[]{Color.YELLOW,Color.RED,Color.BLUE,Color.GREEN,Color.BLACK,Color.CYAN,Color.MAGENTA};
        }

        @Override
        protected void onDraw(Canvas canvas) {
           // super.onDraw(canvas);

            //将背景色 填充为白色
            canvas.drawColor(Color.WHITE);


            //下面初始化7种路径效果
            //不使用路径效果
            mEffects[0] = null;

            //使用 CornerPathEffect 路径效果
            mEffects[1] = new CornerPathEffect(10);

            //使用 DiscretePathEffect
            mEffects[2] = new DiscretePathEffect(3.3f,5.0f);

            //初始化 DashPathEffect
            mEffects[3] = new DashPathEffect(new float[]{20,10,5,10},phase);

            //初始化 PathDashPathEffect
            Path p = new Path();
            p.addRect(0,0,8,8,Path.Direction.CCW);

            mEffects[4] = new PathDashPathEffect(p,12,phase,PathDashPathEffect.Style.ROTATE);

            mEffects[5] = new ComposePathEffect(mEffects[2],mEffects[4]);
            mEffects[6] = new SumPathEffect(mEffects[4],mEffects[3]);

            //将画布移动到(8,8)出 开始绘制
            canvas.translate(8,8);

            //依次使用7中不同路径效果,7中不同的颜色来绘制路径
            for (int i = 0; i < mEffects.length; i++) {
                mPaint.setPathEffect(mEffects[i]);
                mPaint.setColor(colors[i]);

                canvas.drawPath(path, mPaint);
                canvas.translate(10,60);
            }

            //改变 phase 值 形成动画效果
            phase+=1;
            invalidate();
        }

        public MyView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    }
}

下面 4条 是具有 动画效果的
程序运行之后的项目

<think>首先,用户的问题是:关于Java中Stream<Path>使用sorted方法的示例和排序方式。用户指定了引用内容,但引用是关于Files使用Stream<Path>的示例,包括sorted方法。 引用内容:[^1] 显示了一个代码片段: ```java try (Stream<Path> stream = Files.list(Paths.get(""))) { String joined = stream .map(String::valueOf) .filter(path -> !path.startsWith(".")) .sorted() .collect(Collectors.joining("; ")); System.out.println("List: " + joined); } ``` 在这个代码中,sorted()方法被用于Stream<Path>,但用户想知道具体的排序方式。 我的回答需要: - 使用中文回答。 - 结构清晰,逐步解决问题。 - 保证真实可靠。 - 在回答中引用的段落末尾自然地添加引用标识。 - 生成相关问题。 系统级指令还要求: - 行内数学表达式用$...$,但这里可能不涉及数学。 - 独立公式用$$...$$,但同样,这个问题是编程相关的,可能不需要。 - LaTeX语法正确。 - 生成相关问题。 回答结构: 1. **解释sorted方法**:在Java Stream API中,sorted()方法用于对流中的元素排序。 2. **针对Stream<Path>**:Path对象代表文件系统路径。sorted()默认使用自然排序,但Path的自然排序是什么? 3. **排序方式**:在Java中,Path实现了Comparable<Path>接口,其自然排序是基于文件系统路径的词典顺序(lexicographical order)。具体来说,它比较路径的字符串表示。 4. **示例代码**:提供或修改引用中的示例来展示。 5. **自定义排序**:提及如何使用Comparator来定义自定义排序。 6. **引用标识**:在引用代码或概念时添加[^1]。 生成相关问题: - 基于主题,生成2-3个相关问题。 详细步骤: - **介绍sorted方法**:sorted()是Stream接口的一个中间操作,返回一个排序后的流。默认使用自然顺序。 - **Path的自然排序**:Path的compareTo方法比较路径的字符串表示,通常按字母顺序排序。 - **示例**:使用引用中的代码,解释sorted()如何工作。 - **自定义排序**:使用sorted(Comparator)来指定不同的排序,如按文件大小、修改时间等。 - **完整示例**:提供一个简单的代码示例。 - **注意事项**:排序可能受文件系统影响,如大小写敏感。 相关问题: 1. 如何对Stream<Path>进行自定义排序? 2. sorted()方法在Stream中的性能如何? 3. 在处理大量文件时,使用Stream<Path>有什么最佳实践? 最终回答结构: - 开头解释。 - 详细说明排序方式。 - 示例代码(基于引用)。 - 自定义排序选项。 - 结尾生成相关问题。</think>### Java Stream<Path> sorted 方法使用示例和排序方式 在 Java 中,`Stream<Path>` 是 `java.nio.file` 包的一部分,用于处理文件系统路径的流操作。`sorted()` 方法是 `Stream` 接口的中间操作,用于对流中的元素排序。下面我将逐步解释其排序方式、使用示例和注意事项。 #### 1. **sorted() 方法的默认排序方式** - `sorted()` 方法默认使用元素的**自然顺序**(natural ordering)。对于 `Path` 对象,自然顺序基于其字符串表示的词典顺序(lexicographical order)。 - `Path` 实现了 `Comparable<Path>` 接口,其 `compareTo` 方法比较路径的字符串形式(例如,`/user/docs` 和 `/user/data` 会按字母顺序排序)。 - 排序规则: - 区分大小写(取决于文件系统,例如在 Linux 上区分大小写,在 Windows 上不区分)。 - 按路径组件的顺序比较(例如,`/a/b` 排在 `/a/c` 之前)。 - 空路径或无效路径可能抛出异常(如 `NullPointerException`)。 #### 2. **基本使用示例** 以下示例基于您提供的引用代码,展示 `sorted()` 在 `Stream<Path>` 中的使用。代码列出当前目录下的所有路径,过滤隐藏文件(以 "." 开头),排序后拼接成字符串输出[^1]: ```java import java.nio.file.*; import java.util.stream.*; import java.util.*; public class PathSortExample { public static void main(String[] args) throws Exception { try (Stream<Path> stream = Files.list(Paths.get(""))) { String joined = stream .map(String::valueOf) // 将Path转换为字符串 .filter(path -> !path.startsWith(".")) // 过滤隐藏文件 .sorted() // 默认自然排序(词典顺序) .collect(Collectors.joining("; ")); // 拼接结果 System.out.println("List: " + joined); } } } ``` **输出示例**: 如果目录包含文件 `b.txt`, `a.txt`, `.hidden`, 输出可能为: `List: a.txt; b.txt`(排序后隐藏文件被过滤)。 #### 3. **自定义排序方式** 如果默认词典顺序不满足需求,可以使用 `sorted(Comparator<Path>)` 指定自定义比较器。常见场景: - **按文件大小排序**:使用 `Files.size()`。 - **按修改时间排序**:使用 `Files.getLastModifiedTime()`。 - **按路径深度排序**:比较路径组件数量。 示例:按文件大小降序排序: ```java try (Stream<Path> stream = Files.list(Paths.get(""))) { List<Path> sortedPaths = stream .filter(Files::isRegularFile) // 只处理普通文件 .sorted(Comparator.comparingLong(p -> { try { return Files.size(p); // 获取文件大小 } catch (IOException e) { return 0L; // 错误处理 } }).reversed()) // 降序排序 .collect(Collectors.toList()); sortedPaths.forEach(System.out::println); } ``` #### 4. **注意事项** - **性能影响**:`sorted()` 是状态操作,需要缓存所有元素到内存再排序。大目录可能导致 `OutOfMemoryError`,建议使用 `Files.walk` 替代 `Files.list` 分页处理。 - **线程安全**:在并行流(`parallelStream()`)中使用时,确保比较器是线程安全的。 - **文件系统依赖**:排序结果受操作系统影响(如大小写敏感),测试时需注意环境差异。 - **异常处理**:排序中访问文件属性(如大小)可能抛出 `IOException`,需在 lambda 中捕获或使用 `try-catch`。 通过以上示例,您可以根据需求选择默认或自定义排序。`sorted()` 方法使路径处理更灵活,尤其在结合过滤器(如 `filter`)和收集器(如 `collect`)时[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值