翻译画布和偏移动作栏

时间:2012-06-12 13:33:48

标签: java android android-layout

如果不清楚,请耐心等待,这是我第一次在这里发帖。

我在画布上绘制了几行,并试图将画布翻译为屏幕上的线条居中。麻烦的是,我有一个动作栏(使用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);

}

2 个答案:

答案 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)

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

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