我开发了一个显示巴黎地铁地图的应用程序(http://www.businesstravel.fr/images/stories/plan-metro-paris.jpg)。 这些行由自定义视图表示。他们有一个点列表,我在这些点之间画一条路。 (此时车站尚未开发)。 一切都在一个延伸relativeLayout的类中。 所以,这个类包含一个行列表。
我想实现一个缩放缩放手势。我已经关注此链接:Pinch zoom for custom view,它运行正常:检测到我的缩放缩放手势很酷。 但我有一个问题。在缩放到缩放手势期间,调用onDraw方法,但它是自定义relativelayout的onDraw方法...如果我想调用行和工作站自定义视图的onDraw方法,该怎么办? 我试图称无效,但它不起作用......
你有什么想法吗?
告诉我,如果我的说明不清楚,你是否想要一些代码。
另外,作为一个法国人,抱歉我的语言错误。
感谢。
编辑:
这是我的代码。 自定义RelativeLayout: 公共类MapMetro扩展了RelativeLayout {
private ArrayList<Line> listLines;
private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f;
public MapMetro(Context context){
super(context);
this.listLines = new ArrayList<>();
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
return true;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.scale(mScaleFactor, mScaleFactor);
/*
* Here is where I try to redraw my Custom views
*/
for(int i=0;i<this.listLines.size();i++){
this.listLines.get(i).getLineView().invalidate();
}
canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
invalidate();
return true;
}
}
}
这是我的自定义视图:
公共类LineView扩展了View {
private static final int HEIGHT = 5;
private Paint paint;
private Path path;
private CornerPathEffect cpe;
private int color;
private ArrayList<PointF> listLinePoints;
public LineView(Context ct, ArrayList<PointF>listLinePoints, int color) {
super(ct);
this.listLinePoints=listLinePoints;
this.color=color;
this.paint=new Paint();
this.path=new Path();
this.cpe=new CornerPathEffect(5);
}
@Override
public void onDraw(Canvas canvas) {
this.paint.setColor(this.color);
this.paint.setStrokeWidth(HEIGHT);
this.paint.setStyle(Paint.Style.STROKE);
this.paint.setDither(true);
this.paint.setStrokeJoin(Paint.Join.ROUND);
this.paint.setStrokeCap(Paint.Cap.ROUND);
this.paint.setPathEffect(this.cpe);
this.paint.setAntiAlias(true);
this.path.moveTo(this.listLinePoints.get(0).x, this.listLinePoints.get(0).y);
for(int i=1;i<this.listLinePoints.size();i++){
this.path.lineTo(this.listLinePoints.get(i).x, this.listLinePoints.get(i).y);
}
canvas.drawPath(path,paint);
}
public static int getLineHeight() {
return HEIGHT;
}
}
感谢您的帮助。
EDIT2: 我发现了什么似乎是一个解决方案。 在我的自定义视图的构造函数(行的视图)中,我强制视图不绘制自己:
setWillNotDraw(true);
在我的自定义relativeLayout的onDraw中,我调用了func&#34; draw(Canvas)&#34;用我的自定义relativeLayout的画布...不仅仅是......这样做很恶心吗?
感谢。