0

如果不清楚,请多多包涵,这是我第一次在这里发帖。

我在画布上画了几条线,并试图将画布转换为屏幕上的线条居中。问题是,我有一个操作栏(使用 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);

}
4

2 回答 2

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)); 

您可以根据屏幕的纵横比进一步调整比例,以使其更好地工作。

不幸的是,没有真正干净的解决方案,因为您无法读取当前布局和提取大小。

于 2012-06-12T13:38:40.490 回答
0

我使用的解决方案如下所述:

http://developer.android.com/resources/samples/HoneycombGallery/src/com/example/android/hcgallery/TitlesFragment.html

基本上我的活动定义了以下布局侦听器:

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 的高度将移位应用于视图。

于 2012-06-15T12:25:12.053 回答