Android Scaling。

时间:2014-05-09 09:14:07

标签: java android canvas bitmap

我需要将图形缩放到所需的图形,现在我一直在研究它,但我想知道的是我何时应该缩放图形,是否在GraphView类中缩放它,在调用图形的类中。请参阅以下代码:

GraphView:

public final class GraphView extends View {
private static final float SCALE = 0.008f; // map (min,max) to ( 0, 1)
private static final float WIDTH = 0.02f; // map (min,max) to ( 0, 1)
private final static String TAG = "HearingTest";

ArrayList<EarSrt> mPoints;

// drawing tools
private RectF rimRect;
private RectF rimRectTop;
private RectF rimRectBottom;
private float[] centreLine;

private RectF topSideBar;
private RectF bottomSideBar;

private Paint rimPaintTop;
private Paint rimPaintBottom;
private Paint outerRimPaint;
private Paint centreLinePaint;

private Paint topSideBarPaint;
private Paint bottomSideBarPaint;

private Paint titlePaint;   
private Paint keyPaint;

private Paint correctPointPaint;
private Paint incorrectPointPaint;
private Paint linePaint;
private Paint pointOutlinePaint;
private Paint averagePaint;

private Paint backgroundPaint; 
// end drawing tools

private Bitmap background; // holds the cached static part
private float mAverage;

public GraphView(Context context) {
    super(context);
    init();
}

public GraphView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public GraphView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

private void init() {
    initDrawingTools();
}

private String getTitle() {
    return getContext().getString(R.string.Normal_hearing);
}

private void initDrawingTools() {
    rimRect = new RectF(0.0f, 0.0f, 1.0f, 1.0f);

    rimRectTop = new RectF(0.0f, 0.5f, 1.0f, 1.0f);
    rimRectBottom = new RectF(0.0f, 0.0f, 1.0f, 0.5f);
    centreLine = new float[4];
    centreLine[0]=0.0f;
    centreLine[1]=0.5f;
    centreLine[2]=1.0f;
    centreLine[3]=0.5f;

    topSideBar = new RectF(0.95f, 0.5f, 1.0f, 1.0f);
    bottomSideBar  = new RectF(0.95f, 0.0f, 1.0f, 0.5f);

    // the linear gradient is a bit skewed for realism
    rimPaintTop = new Paint();
    rimPaintTop.setFlags(Paint.ANTI_ALIAS_FLAG);
    rimPaintTop.setShader(new LinearGradient(0.40f, 0.0f, 0.60f, 1.0f, 
                                       0xff9ea3ac,
                                       0xffc0c2c6,
                                       TileMode.CLAMP));

    rimPaintBottom = new Paint();
    rimPaintBottom.setFlags(Paint.ANTI_ALIAS_FLAG);
    rimPaintBottom.setShader(new LinearGradient(0.40f, 0.0f, 0.60f, 1.0f, 
                                        0xffc5cbbd,
                                        0xff3d4649,
                                       TileMode.CLAMP));


    outerRimPaint = new Paint();
    outerRimPaint.setAntiAlias(true);
    outerRimPaint.setStyle(Paint.Style.STROKE);
    outerRimPaint.setColor(Color.argb(0x4f, 0x33, 0x36, 0x33));
    outerRimPaint.setStrokeWidth(0.001f);

    centreLinePaint = new Paint();
    centreLinePaint.setStyle(Paint.Style.STROKE);
    centreLinePaint.setColor(0xff90cc38);
    centreLinePaint.setAntiAlias(true);
    centreLinePaint.setStrokeWidth(0.02f);

    topSideBarPaint = new Paint();
    topSideBarPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
    topSideBarPaint.setShader(new LinearGradient(0.40f, 0.0f, 0.60f, 1.0f, 
               0xffc5cbbd,
               0xff3d4649,
               TileMode.CLAMP));

    bottomSideBarPaint = new Paint();
    bottomSideBarPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
    bottomSideBarPaint.setShader(new LinearGradient(0.40f, 0.0f, 0.60f, 1.0f, 
                0xff4c9b3e,
                0xffa0dd61,
               TileMode.CLAMP));

    titlePaint = new Paint();
    titlePaint.setColor(0xffffffff);
    titlePaint.setAntiAlias(true);
    titlePaint.setTypeface(Typeface.DEFAULT_BOLD);
    titlePaint.setTextAlign(Paint.Align.LEFT);
    titlePaint.setTextSize(0.05f);
    titlePaint.setTextScaleX(0.8f);
    titlePaint.setLinearText(true);

    keyPaint = new Paint();
    keyPaint.setColor(0xff000000);
    keyPaint.setAntiAlias(true);
    keyPaint.setTypeface(Typeface.DEFAULT_BOLD);
    keyPaint.setTextAlign(Paint.Align.LEFT);
    keyPaint.setTextSize(0.05f);
    keyPaint.setTextScaleX(0.8f);
    keyPaint.setLinearText(true);

    backgroundPaint = new Paint();
    backgroundPaint.setFilterBitmap(true);
    backgroundPaint.setColor(0xff000000);

    linePaint = new Paint();
    linePaint.setColor(0xffffffff);
    linePaint.setStrokeWidth(0);

    averagePaint = new Paint();
    averagePaint.setColor(0xff000000);
    averagePaint.setStyle(Paint.Style.FILL);

    correctPointPaint = new Paint();
    correctPointPaint.setColor(0xff90cc38);
    correctPointPaint.setStyle(Paint.Style.FILL);


    incorrectPointPaint = new Paint();
    incorrectPointPaint.setColor(0xffb1b3ba);
    correctPointPaint.setStyle(Paint.Style.FILL);

    pointOutlinePaint = new Paint();
    pointOutlinePaint.setStyle(Paint.Style.STROKE);
    pointOutlinePaint.setColor(0xffffffff);
    pointOutlinePaint.setAntiAlias(true);
    pointOutlinePaint.setStrokeWidth(0.0f);
}

private void drawRim(Canvas canvas) {
    // first, draw the metallic body
    canvas.drawRect(rimRectTop, rimPaintTop);
    canvas.drawRect(rimRectBottom, rimPaintBottom);

    // now the outer rim circle
    canvas.drawRect(rimRect, outerRimPaint);

    // Draw middleline
    canvas.drawLines(centreLine, centreLinePaint);

    // Draw sidebars
    canvas.drawRect(topSideBar, topSideBarPaint);
    canvas.drawRect(bottomSideBar, bottomSideBarPaint);

}

public void setPoints( ArrayList<EarSrt> aPoints){
    mPoints = aPoints;
}

private void drawTitle(Canvas canvas) {
    String title = getTitle();  
    canvas.drawText(title, 0.1f, 0.1f, titlePaint);
}

private void drawBackground(Canvas canvas) {
    if (background == null) {
    } else {
        canvas.drawBitmap(background, 0, 0, backgroundPaint);
    }
}

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // We purposely disregard child measurements because act as a
    // wrapper to a SurfaceView that centers the camera preview instead
    // of stretching it.
    final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
    final int height = (int)(width * 0.8f);
    setMeasuredDimension(width, height);
}

@Override
protected void onDraw(Canvas canvas) {
    drawBackground(canvas);

    canvas.restore();
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    regenerateBackground();
}

private void regenerateBackground() {
    // free the old bitmap
    if (background != null) {
        background.recycle();
    }

    background = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    Canvas backgroundCanvas = new Canvas(background);
    float scaleWidth = (float) getWidth();
    float scaleHeight = (float) getHeight();        
    backgroundCanvas.scale(scaleWidth, scaleHeight/1.23f);

    drawRim(backgroundCanvas);
    drawTitle(backgroundCanvas);    
    drawPoints(backgroundCanvas);

    drawKey(backgroundCanvas);
}

private void drawPoints(Canvas canvas) {    

    float gap = 1.0f/((float)mPoints.size()+2);

    // Iterate though the points twice, once to
    // draw the line and one to draw the points
    // doesn't appear to be the most efficient 
    // method, but calculations of point size etc

    // Draw line
    int count = 1;
    float prev_x = 0.0f;
    float prev_y = 0.0f;
    for ( EarSrt vo : mPoints){
        float y_pos = 0.5f + 2*( vo.getSrt() - 24.0f)*SCALE;
        float x_pos = gap*count;


        if ( count != 1 ){
            canvas.drawLine(prev_x, prev_y, x_pos, y_pos, linePaint);
        }

        count++;

        prev_x = x_pos;
        prev_y = y_pos;     
    }

    // draw points
    count = 1;
    for ( EarSrt vo : mPoints){
        float y_pos = 0.5f + 2*( vo.getSrt() - 24.0f)*SCALE;
        float x_pos = gap*count;
        count++;

        RectF rect = new RectF(x_pos - WIDTH, y_pos - WIDTH, x_pos + WIDTH, y_pos + WIDTH);

        if ( vo.isCorrect() ) {
            canvas.drawRect(rect, correctPointPaint);
        } else {
            canvas.drawRect(rect, incorrectPointPaint);
        }

        canvas.drawRect(rect, pointOutlinePaint);
    }

    // Plot average line
    float yAverage = 0.5f + 2*( mAverage - 24.0f)*SCALE;
    RectF averageRect  = new RectF(0.95f, yAverage - WIDTH/2.0f, 1.0f, yAverage + WIDTH/2.0f);
    canvas.drawRect(averageRect, averagePaint);
 }

private void drawKey(Canvas canvas) {
    float rightEdge = 0.05f;
    float leftEdge = 0.05f + 4 * WIDTH;
    //float leftEdge = WIDTH;

    // Example correct square
    RectF rect = new RectF(rightEdge, 1.1f - WIDTH, rightEdge + 2 * WIDTH, 1.1f + WIDTH);
    canvas.drawRect(rect, correctPointPaint);   
    canvas.drawRect(rect, pointOutlinePaint);

    String correctResults = getContext().getString(R.string.Correct_results);
    canvas.drawText(correctResults, leftEdge, 1.1f + WIDTH, keyPaint);

    // Test result line
    RectF averageRect  = new RectF(rightEdge, 1.2f - WIDTH/2.0f, rightEdge + 2 * WIDTH, 1.2f + WIDTH/2.0f);
    canvas.drawRect(averageRect, averagePaint);

    String testResults = getContext().getString(R.string.Your_test_result);
    canvas.drawText(testResults, leftEdge, 1.2f + WIDTH/2.0f, keyPaint);
}

public void setAverage(float aAverage) {
    mAverage = aAverage;

}
}

调用GraphView的方法:

public class RightEarResults extends SherlockFragment{

private Button btn;
private TextView txt;
private final static String TAG = "HearingTest";
String resultsString;
private ArrayList<EarSrt> rightAnswerList;
float rightAverage;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.result_tab, container, false);
    btn = (Button) rootView.findViewById(R.id.locate_btn);       
    resultsString = getArguments() != null ? getArguments().getString("results") : "No data";
    rightAnswerList =  getArguments().getParcelableArrayList("graph");
    rightAverage = getArguments().getFloat("average");
    txt = (TextView) rootView.findViewById(R.id.results_text);
    GraphView graphView = (GraphView)rootView.findViewById(R.id.graphview);
    graphView.setPoints(rightAnswerList);
    graphView.setAverage(rightAverage);
    txt.setText(resultsString);
    btn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), MapActivity.class);
            startActivity(intent);
        }
    });

    return rootView;
}
}

图表屏幕截图:

enter image description here

我需要将其缩小很多,因为它会切断大量的信息!

基本上,我是否会缩放Graph类中的GraphView以及我在该类中的哪个位置进行缩放?或者我在RightEarResults课程中进行缩放?任何帮助都将很高兴。感谢

0 个答案:

没有答案