Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在绘制路径时更改路径部分的颜色_Android_Canvas - Fatal编程技术网

Android 在绘制路径时更改路径部分的颜色

Android 在绘制路径时更改路径部分的颜色,android,canvas,Android,Canvas,我设法创建了自己的自定义路径绘制应用程序,如下所示 public class CanvasView extends View { Context context; HashMap<Integer,PathWrapper> locToPath=new HashMap<>(); ArrayList<PathWrapper> activePaths=new ArrayList<>(); CoMingleAndroidRuntime<Screensh

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

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;
}
public类CanvasView扩展视图{
语境;
HashMap locToPath=新HashMap();
ArrayList ActivePath=新的ArrayList();
CoMingleAndroidRuntime屏幕运行时;
布尔初始化=假;
整数位置;
公共画布视图(上下文、属性集属性){
超级(上下文,attr);
setWillNotDraw(假);
this.context=上下文;
}
public void init(CoMingleAndroidRuntime屏幕运行时){
inited=true;
this.screenRuntime=screenRuntime;
this.myLocation=screenRuntime.getLocation();
addPath(myLocation);
使无效();
}
公共void addPath(int位置){
Paint mPaint=新油漆();
mPaint.setColor(Color.BLACK);
mPaint.setAlpha(195);
mPaint.setStyle(油漆、样式、笔划);
mPaint.setStrokeJoin(油漆.连接.圆形);
mPaint.设定行程宽度(50f);
put(位置,新路径包装器(新路径(),mPaint,位置));
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
for(路径包装器路径:ActivePath){
canvas.drawPath(path.path,path.paint);
}
使无效();
}
公共无效响应颜色更改(整数R、整数G、整数B){
locToPath.get(myLocation.paint.setColor(Color.rgb(R,G,B));
}
公共无效响应颜色更改(整数loc、整数R、整数G、整数B){
locToPath.get(loc.paint.setColor(Color.rgb(R,G,B));
}
public void respondActionDown(最终整数loc、int-xTouch、int-yTouch){
add(locToPath.get(loc));
locToPath.get(loc.path.moveTo(xTouch,yTouch);
locToPath.get(loc).lastPoint=新点(xTouch,yTouch);
如果(loc==myLocation){
screenRuntime.getRewriteMachine().addActionDown(xTouch,yTouch);
}
}
public void respondActionMove(最终整数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);
如果(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=新点(xTouch,yTouch);
如果(loc==myLocation){
screenRuntime.getRewriteMachine().addActionMove(xTouch,yTouch);
}
}
}
公共无效响应(最终整数loc,整数x,整数y){
locToPath.get(loc.path.lineTo(locToPath.get(loc.lastPoint.x,locToPath.get(loc.lastPoint.y));
如果(loc==myLocation){
screenRuntime.getRewriteMachine().addActionUp(x,y);
}
activepath.remove(locToPath.get(loc));
get(loc.path.reset();
}
@凌驾
公共布尔onTouchEvent(运动事件){
如果(初始化){
int xTouch;
int yTouch;
xTouch=(int)event.getX(0);
yTouch=(int)event.getY(0);
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
respondActionDown(myLocation、xTouch、yTouch);
打破
case MotionEvent.ACTION\u移动:
响应移动(myLocation、xTouch、yTouch);
打破
case MotionEvent.ACTION\u UP:
响应向上(myLocation、xTouch、yTouch);
打破
}
返回true;
}
返回false;
}
这段代码非常适合我的应用程序(忽略位置信息、运行时信息和重写机器信息)

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


谢谢。

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

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),我不确定它是否有效在先前创建和使用的绘画上。

你是说要对绘画进行动画制作吗?你不需要alpha。你可以对绘画进行动画制作,这样每次你用你想显示的任何东西重新绘制它,然后再为下一个动画帧重新绘制它…@Gavriel不完全是这样,绘画的动画效果非常好,因为我经常可以如果从onDraw函数中执行无效操作,将导致无限的onDraw循环,这符合我的目的。我的要求是,我希望路径的一部分具有与另一部分不同的颜色,但是如果我更改路径的绘制,它将更改整个路径的颜色,而不仅仅是其中的一部分。是的,如果我可以将一条路径拆分为两条路径,在这种情况下,我可以简单地将我的路径拆分为许多较小的部分,并按照我的意愿对每个部分进行着色,但是我认为我无法拆分一条路径,因此这将不起作用。:/谢谢。然后我不明白你想要什么。drawPath获得一条路径和一幅绘画,并用该绘画绘制路径。这不像绘画智慧h一个画笔,你从全画笔开始,2米后,它的颜色会变少。如果你不打断你的完整路径到分段,那么android怎么猜你想要什么“动画”呢?油漆应该足够1米或2米吗?当它变少时,它应该是线性的还是指数的还是什么的?如果你不告诉所有这些事情,没有人知道(包括安卓)可以猜到,如果我不清楚,我想做的是画一条路径,如果路径的长度是50像素或更多(当我画的时候),那么路径的最后50像素应该是vis