画布Android中的重叠路径

时间:2016-10-28 03:51:08

标签: android android-canvas android-custom-view porter-duff

我正在尝试绘制一个由多个路径组成的形状: -

多个 灰色 这样的线路

Path path1 = new Path();
    path1.moveTo(2 * w, 2 * h);
    path1.lineTo(0, 2 * h - perpendicular);
    pathColorList.add(Pair.create(path1, Color.GRAY));

蓝色 这样的直线路径

    Path path2 = new Path();
    path2.moveTo(0, 2 * h - perpendicular);
    path2.lineTo(w * 2, 2 * h - 2 * perpendicular);
    pathColorList.add(Pair.create(path2, Color.BLUE));

pathColorList是路径列表及其颜色。

List<Pair<Path, Integer>> pathColorList = new ArrayList<Pair<Path, Integer>>();
  • 问题是我需要 蓝色 路径始终位于 灰色 路径之上。即使 灰色 路径重叠 蓝色 路径;重叠区域必须是蓝色而不是灰色,所以看起来蓝色带仍然位于灰色带顶部。

  • 我尝试过: -

    • 一种方法是绘制所有灰色路径,然后绘制所有蓝色路径。但我试图绘制的形状有多个灰色和蓝色重叠,需要按照路径动画的顺序绘制,所以我不能这样做。

    • 我尝试在Gray路径上使用PorterDuffXfermode,但PorterDuffXfermode似乎都没有工作

      for(Pair pathColor             :pathColorList){

          if (pathColor.second == Color.GRAY) {
      
              if (shader == null) {
                  shader = new LinearGradient(0, 0, 0, getWidth(),
                          Color.DKGRAY, Color.LTGRAY, Shader.TileMode.MIRROR);
                  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
                  paint.setColor(pathColor.second);
      
              }
              paint.setShader(shader);
      
          } else {
              paint.setShader(null);
              paint.setColor(pathColor.second);
              paint.setXfermode(null);
          }
      
          canvas.drawPath(pathColor.first, paint);
      }
      

我无法弄清楚我做错了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

尝试一下...

1.--将颜色按颜色首选项排序。


class HomeController extends StatefulWidget {
  HomeController({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _HomeControllerState createState() => _HomeControllerState();
}

class _HomeControllerState extends State<HomeController> {

  String errorMessage; // => My exemple of global variable
  bool debugFunctionStart = true;

  final _formKey = GlobalKey<FormState>();

  @override
  void initState() {
    super.initState();
  }
...

2.-对象 Path 具有一个int变量,其颜色保持为 Path

3.-在绘制之前,您具有一个包含 Path 对象

的列表

4.-在绘制之前,请按颜色属性并按照1

中描述的颜色首选项标准订购此 Path 列表。

祝你好运!!!!