如果不清楚,请耐心等待,这是我第一次在这里发帖。
我在画布上绘制了几行,并试图将画布翻译为屏幕上的线条居中。麻烦的是,我有一个动作栏(使用actionbarsherlock)我想从翻译中排除,即我希望视图的顶部位于操作栏下。
实际上,数据在整个屏幕高度上垂直居中,但我希望它只在操作栏下的画布的可见部分垂直居中。
有关实现这一目标的最佳方法的任何想法吗?
@Override
protected void onDraw(Canvas canvas) {
Paint paint = mPaint;
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.FILL);
int centrew = canvas.getWidth()/2;
int centreh = canvas.getHeight()/2;
canvas.translate(centrew, centreh);
canvas.drawLine(0, -5, 0, 5, mPaint);
canvas.drawLine(5, 0, -5, 0, mPaint);
}
答案 0 :(得分:0)
如果您知道条的确切大小,可以将其应用于整体画布高度以增加移位:
int maxV = canvas.getHeight() + barHeight;
int centreh = maxV/2;
我假设,条形图位于顶部,覆盖画布的一部分,因此移位(从左上角开始)必须更大。如果栏位于底部,则应减少班次:
int maxV = canvas.getHeight() - barHeight;
int centreh = maxV/2;
编辑:如果条形图在不同设备上的像素大小不同,则必须进行一些修改才能使其正常工作。您可以安全地对酒吧进行预防并修改它们以防万一。您可以假设为条形图保留一定的比率并相应地调整绝对像素数(相似之处仅用于说明):
int maxV = Math.round(canvas.getHeight()*(1f + barRatio));
您可以根据屏幕的宽高比进一步调整比例,使其更好地工作。
不幸的是,由于您无法读取当前布局和提取大小,因此没有真正干净的解决方案。
答案 1 :(得分:0)
我使用的解决方案如下所述:
基本上我的活动定义了以下布局侦听器:
ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mmv.setAbShift(MunroBag.this.actionBar.getHeight());
}
};
然后视图类定义了以下方法:
public void setAbShift(int shift)
{
abShift = shift;
this.invalidate();
}
因此调用onDraw并根据actionBar高度将移位应用于视图。