缩放画布以编程方式适合视图

时间:2012-06-17 12:24:03

标签: android scale android-canvas android-view

我正在寻求以下扩展问题的帮助。

我已经构建了自己的View类(自定义视图),它是Dialog的子级。 在此自定义视图中,我从下到上绘制垂直方向的图形。 图表可以大于或小于View的大小。 因此,我想使用Canvas方法将图表绘制到View(大于onDraw())(请参阅下面的代码),然后将Canvas缩放到适合View

我尝试过的事情已经包括ScaleAnimation使用duration=0或调用canvas.scale()方法。每次都有相同的结果;图表没有缩放。

我已经阅读了不同的主题:

How to resize a custom view programmatically?

Android scale view

感谢您的帮助。

VerticalGraphView代码:

public class VerticalGraphView extends View {
    private static final String TAG = "VerticalGraphView";

    private int[] ch1_data = new int[1000];
    private int[] ch2_data = new int[1000];
    private int mCanvasHeight = 1000;
    private int mCanvasWidth = 242;
    private Paint ch1_color = new Paint();
    private Paint ch2_color = new Paint();
    private Paint zero_color = new Paint();
    private Paint grid_paint = new Paint();
    private Paint outline_paint = new Paint();

    public VerticalGraphView(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.d(TAG, "VerticalGraphView-Constructor called!");
    }

    protected void onFinishInflate() {
        super.onFinishInflate();
        Log.d(TAG, "onFinishInflate()-called!");

     // Log.i(TAG, "New Size set for height = " + setSizeHeight);
    }

    protected void onDraw(Canvas canvas) {
        Log.d(TAG, "onDraw()-called!");

     // // RESIZE TO FIT THE DATA
     // Bitmap b = Bitmap.createBitmap(mCanvasWidth, ch1_data.length, Bitmap.Config.ARGB_8888);
     // Canvas canvas = new Canvas(b);
     // canvas.setBitmap(b);

        ch1_color.setColor(Color.BLUE);                
        ch2_color.setColor(Color.RED);

        zero_color.setColor(Color.argb(80,0,0,00));
        zero_color.setStrokeWidth(3f);

        grid_paint.setColor(Color.rgb(200, 200, 200));

        outline_paint.setColor(Color.BLACK);
        outline_paint.setStrokeWidth(2f);

        if (canvas != null) {
            // Redraw the background
            canvas.drawRGB(255, 255, 255);

            // Draw vertical grey lines
            for (int vertical = 1; vertical<6; vertical++) {
                if (vertical == 3) { // Draw line in the middle
                    canvas.drawLine( vertical*(mCanvasWidth/6)+1, 1,
                                     vertical*(mCanvasWidth/6)+1, 
                                     mCanvasHeight+1,
                                     zero_color);
                } else {
                    canvas.drawLine( vertical*(mCanvasWidth/6)+1, 1,
                                     vertical*(mCanvasWidth/6)+1,
                                     mCanvasHeight+1,
                                     grid_paint);
                }
            }            

            // Draw horizontal grey lines
            for (int horizontal = 1; horizontal<10; horizontal++) {
                canvas.drawLine(1, horizontal*(mCanvasHeight/10)+1,
                                mCanvasWidth+1, 
                                horizontal*(mCanvasHeight/10)+1,
                                 grid_paint);
            }

            // draw outline
            canvas.drawLine(0, 0, (mCanvasWidth+1), 0, outline_paint); // top
            canvas.drawLine((mCanvasWidth), 0, (mCanvasWidth), (mCanvasHeight+1),
                            outline_paint);  //right
            canvas.drawLine(0, (mCanvasHeight), (mCanvasWidth), (mCanvasHeight),
                            outline_paint);    // bottom
            canvas.drawLine(0, 0, 0, (mCanvasHeight+1), outline_paint); //left

            // plot data
            int middle = mCanvasWidth / 2;

            for (int x=0; x<(ch2_data.length-1); x++) {                
                canvas.drawLine((middle + ch2_data[x]),(mCanvasHeight - x),
                                (middle + ch2_data[x+1]), 
                                (mCanvasHeight - x+1), 
                                ch2_color);
                canvas.drawLine((middle + ch1_data[x]),(mCanvasHeight - x),
                                (middle + ch1_data[x+1]), 
                                (mCanvasHeight - x+1), 
                                ch1_color);
            }
        }

        Log.e(TAG, "canvas.Height = " + canvas.getHeight());
        Log.e(TAG, "canvas.Width = " + canvas.getWidth());

        // RESIZE TO FIT THE VIEW, only in Y-Direction
        // Fits the canvas onto the view
        float ratio = ((float) canvas.getHeight()) / (float) mCanvasHeight;
        Log.e(TAG, "SCALE: ratio = " + ratio);

     // ScaleAnimation anim = new ScaleAnimation(1f,1f,1f,ratio, 0.5f, 0.5f);
     // anim.setDuration(1000);
     // this.startAnimation(anim);

     // canvas.scale(0f, ratio, canvas.getWidth() * 0.5f , canvas.getHeight() * 0.5f);

     // canvas.save(Canvas.MATRIX_SAVE_FLAG);
     // canvas.scale(0f, ratio, mCanvasWidth * 0.5f , mCanvasHeight * 0.5f);
     // canvas.restore(); 

     // canvas.scale(0f, 0.5f, mCanvasWidth * 0.5f , mCanvasHeight * 0.5f);
     // canvas.scale(100, 100);
     // canvas.getMatrix().postScale(0.5f, 0.5f);

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(242, 500);
     // params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); 
        params.addRule(RelativeLayout.CENTER_IN_PARENT);
        this.setLayoutParams(params);

     // RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativeLayoutRight);
     // ViewGroup.LayoutParams params = layout.getLayoutParams();
     // params.height = 500;
     // params.width = canvas.getWidth();
     // layout.setLayoutParams(params);
     // invalidate();

     // DRAW THE CANVAS
        super.onDraw(canvas);
    }        

    public void setData(int[] data1, int[] data2 ) {
        Log.d(TAG, "setData()-called!");
        ch1_data = data1;
        ch2_data = data2;
    }

    /**
     * This method sets the height of the View.</br>
     * <b><u>NOTE:</u></b> The method call deletes all data stored for the graph.
     * @param newHeight the new height of the view
     */

    public void setHeight(int newHeight) {
        mCanvasHeight = newHeight;
        ch1_data = new int[newHeight];
        ch2_data = new int[newHeight];
    }
}

Dialog中使用的layout.xml:

<com.android.Ui.VerticalGraphView 
    android:id="@+id/verticalGraphView"
    android:layout_width="242dp"
    android:layout_height="1000dp"
    android:layout_centerInParent="true" />

1 个答案:

答案 0 :(得分:0)

  1. 您不应该在onDraw()方法中更改布局。在onDraw方法中,你必须采用当前的布局状态并处理它(并在其边界内绘制)。

  2. 尝试计算所需的视图大小,然后设置布局参数。每次你需要扩展时,再做一次。如果需要更新,请调用invalidate()。