我的解决方案如下。在我与我的路径相交之前,我将它们放大。交叉路口后,我将它们缩小。我不知道这是否是一个好的解决方案,但它对我有用。它也很快。在我的示例中,我将圆形路径与自己创建的图案(条纹)相交。缩放时看起来仍然不错:-)
这是我的代码:
Path mypath=new Path(<desiredpath to fill with a pattern>);
String sPatternType=cpath.getsPattern();
Path pathtempforbounds=new Path(cpath.getPath());
RectF rectF = new RectF();
if (sPatternType.equals("1")){
turnPath(pathtempforbounds, -45);
}
pathtempforbounds.computeBounds(rectF, true);
float ftop=rectF.top;
float fbottom=rectF.bottom;
float fleft=rectF.left;
float fright=rectF.right;
float xlength=fright-fleft;
Path pathpattern=new Path();
float ypos=ftop;
float xpos=fleft;
float fStreifenbreite=4f;
while(ypos<fbottom){
pathpattern.moveTo(xpos,ypos);
xpos=xpos+xlength;
pathpattern.lineTo(xpos, ypos);
ypos=ypos+fStreifenbreite;
pathpattern.lineTo(xpos, ypos);
xpos=xpos-xlength;
pathpattern.lineTo(xpos, ypos);
ypos=ypos-fStreifenbreite;
pathpattern.lineTo(xpos, ypos);
pathpattern.close();
ypos=ypos+2*fStreifenbreite;
}
// Original vergrössern
scalepath(pathpattern,10);
scalepath(mypath,10);
if (sPatternType.equals("1")){
Matrix mdrehen=new Matrix();
RectF bounds=new RectF();
pathpattern.computeBounds(bounds, true);
mdrehen.postRotate(45, (bounds.right + bounds.left)/2,(bounds.bottom + bounds.top)/2);
pathpattern.transform(mdrehen);
}
RectF rectF2 = new RectF();
mypath.computeBounds(rectF2, true);
Region clip = new Region();
clip.set((int)(rectF2.left-100f),(int)(rectF2.top -100f), (int)(rectF2.right+100f),(int)( rectF2.bottom+100f));
Region region1 = new Region();
region1.setPath(pathpattern, clip);
Region region2 = new Region();
region2.setPath(mypath, clip);
region1.op(region2, Region.Op.INTERSECT);
Path pnew=region1.getBoundaryPath();
scalepath(pnew, 0.1f);
cpath.setPathpattern(pnew);
public void turnPath(Path p,int idegree){
Matrix mdrehen=new Matrix();
RectF bounds=new RectF();
p.computeBounds(bounds, true);
mdrehen.postRotate(idegree, (bounds.right + bounds.left)/2,(bounds.bottom + bounds.top)/2);
p.transform(mdrehen);
}
public void scalepath(Path p,float fscale){
Matrix mverkleinern=new Matrix();
mverkleinern.preScale(fscale,fscale);
p.transform(mverkleinern);
}