【问题标题】:Changing the color of part of a path while it is being drawn在绘制路径时更改部分路径的颜色
【发布时间】:2016-02-08 19:43:33
【问题描述】:

我设法创建了自己的自定义路径绘制应用程序,如下所示

public class CanvasView extends View {
Context context;
HashMap<Integer,PathWrapper> locToPath=new HashMap<>();
ArrayList<PathWrapper> activePaths=new ArrayList<>();
CoMingleAndroidRuntime<Screenshare> screenRuntime;
boolean inited=false;
Integer myLocation;
public CanvasView(Context context,AttributeSet attr) {
    super(context, attr);
    setWillNotDraw(false);
    this.context = context;
}

public void init(CoMingleAndroidRuntime<Screenshare> screenRuntime){
    inited=true;
    this.screenRuntime=screenRuntime;
    this.myLocation=screenRuntime.getLocation();
    addPath(myLocation);
    invalidate();
}

public void addPath(int Location){
    Paint mPaint=new Paint();
    mPaint.setColor(Color.BLACK);
    mPaint.setAlpha(195);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeWidth(50f);
    locToPath.put(Location, new PathWrapper(new Path(), mPaint, Location));
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    for(PathWrapper path:activePaths){
        canvas.drawPath(path.path, path.paint);
    }
    invalidate();
}
public void respondActionColorChanged(int R,int G,int B){
    locToPath.get(myLocation).paint.setColor(Color.rgb(R, G, B));
}
public void respondActionColorChanged(int loc,int R,int G,int B){
    locToPath.get(loc).paint.setColor(Color.rgb(R, G, B));
}
public void respondActionDown(final Integer loc, int xTouch,int yTouch){
    activePaths.add(locToPath.get(loc));
    locToPath.get(loc).path.moveTo(xTouch, yTouch);
    locToPath.get(loc).lastPoint = new Point(xTouch, yTouch);
    if(loc==myLocation){
        screenRuntime.getRewriteMachine().addActionDown(xTouch, yTouch);
    }
}
public void respondActionMove(final Integer loc,int xTouch,int yTouch){
    float dx = Math.abs(xTouch - locToPath.get(loc).lastPoint.x);
    float dy = Math.abs(yTouch - locToPath.get(loc).lastPoint.y);
    if (dx >= 5 || dy >= 5) {
        locToPath.get(loc).path.quadTo(locToPath.get(loc).lastPoint.x, locToPath.get(loc).lastPoint.y, (xTouch + locToPath.get(loc).lastPoint.x) / 2, (yTouch + locToPath.get(loc).lastPoint.y) / 2);
        locToPath.get(loc).lastPoint = new Point(xTouch, yTouch);
        if(loc==myLocation){
            screenRuntime.getRewriteMachine().addActionMove(xTouch, yTouch);
        }
    }

}
public void respondActionUp(final Integer loc,int x,int y){
    locToPath.get(loc).path.lineTo(locToPath.get(loc).lastPoint.x, locToPath.get(loc).lastPoint.y);

    if(loc==myLocation){
        screenRuntime.getRewriteMachine().addActionUp(x, y);
    }
    activePaths.remove(locToPath.get(loc));
    locToPath.get(loc).path.reset();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
    if(inited) {
        int xTouch;
        int yTouch;
        xTouch = (int) event.getX(0);
        yTouch = (int) event.getY(0);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                respondActionDown(myLocation,xTouch,yTouch);
                break;
            case MotionEvent.ACTION_MOVE:
                respondActionMove(myLocation, xTouch,yTouch);
                break;
            case MotionEvent.ACTION_UP:
                respondActionUp(myLocation, xTouch,yTouch);
                break;
        }
        return true;
    }
    return false;
}

此代码非常适合我的应用程序(忽略位置内容和运行时以及 rewriteMachine 内容)。

我的问题是,我想让部分路径的颜色不同,最终目标是我只希望路径的最后几个像素可见,其余部分的 Alpha 应为 0,例如当用户绘制时,他只看到路径的最后几个像素,然后慢慢变得不可见。这可能吗?如果是这样,我该怎么做?

谢谢。

【问题讨论】:

  • 您的意思是为绘图设置动画?你不需要 alpha 的东西。您为绘图设置动画,以便每次使用您想要显示的任何内容重绘它,然后为下一个动画帧重绘它......
  • @Gavriel 不太好,绘图的动画效果很完美,因为我经常从 onDraw 函数调用 invalidate 函数,这会导致无限的 onDraw 循环,这符合我的目的。我的要求是我希望路径的一部分具有与另一部分不同的颜色,但是如果我更改路径的颜色,它会更改整个路径的颜色,而不仅仅是其中的一部分。

标签: android canvas


【解决方案1】:

不是向路径添加点,而是创建路径列表,并且每次向列表中添加一个新路径,该路径只有一个小块,从前一个路径的终点开始,并且只有一个其他点(终点)。然后你可以用不同的颜色绘制每条路径:

Paint mPaint=new Paint();
mPaint.setColor(Color.BLACK);
//rest of mPaint...
canvas.drawPath(path1, mPaint);

mPaint=new Paint();
mPaint.setColor(Color.BLUE);
//rest of mPaint...
canvas.drawPath(path2, mPaint);

请注意,path1 与 path2 不同,更重要的是您为每种颜色创建了一个新的 mPaint。我不确定如果您只是在先前创建和使用的油漆上调用 mPaint.setColor(Color.BLUE) 是否会起作用。

【讨论】:

  • 是的,如果我可以将路径拆分为两条路径,这将是一个不错的解决方案,在这种情况下,我可以简单地将路径拆分为许多更小的段并按照我的意愿为每个段着色,但是我没有不认为我可以拆分路径,所以这行不通。 :/ 不过谢谢。
  • 那我不明白你想要什么。 drawPath 获取路径和绘画并使用该绘画绘制路径。这不像用刷子绘画,你从全刷开始,2米后颜色变少。如果您不破坏分段的完整路径,那么 android 将如何猜测您想要什么“动画”?油漆应该够1m还是2m?当它越来越少时,它应该是线性的还是指数的或其他什么?如果你不把这些事情都说出来,没有人(包括安卓)可以猜到它们
  • 抱歉,如果我不清楚,我想做的是绘制一条路径,如果路径的长度为 50 像素或更多(如我绘制的那样),那么路径的最后 50 像素应该只可见,并且路径应该在距离我的手指触摸屏幕的位置 50 像素后消失。
  • 你需要分割路径并用不同的颜色绘制“褪色”的每一部分
  • 这是我的问题,因为没有“Path.split()”函数,据我所知,您不能将路径拆分为多个路径,否则就像我之前所说的那样,您的解决方案将是完美的。
猜你喜欢
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多