【问题标题】:how to draw a circle on center of any device in android如何在android中的任何设备的中心画一个圆圈
【发布时间】:2012-08-30 06:07:13
【问题描述】:

我想在任何设备的中心绘制一个圆圈或任何对象。但我无法准确地在所有设备中获得设备中心。我可以在某些设备上工作,但在最大情况下它不能准确地绘制。请帮助..提前谢谢。我也在这里发布我的代码

 package com.app.maxcircle;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

public class CircleWithMaxRadiusActivity extends Activity {
    /** Called when the activity is first created. */

    float pixelCenterX, pixelCenterY;
    DrawCanvasCircle pcc;
    LinearLayout ll;
    private Canvas canvas;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Display display = getWindowManager().getDefaultDisplay();
        int width = display.getWidth();
        int height = display.getHeight();
        ll = (LinearLayout) findViewById(R.id.ll);
        float centerx = width / 2;
        float centery = height / 2;
        pixelCenterX = convertDpToPixel(centerx, this);
        pixelCenterY = convertDpToPixel(centery, this);
        System.out.println("px..." + pixelCenterX);
        System.out.println("py..." + pixelCenterY);

        pcc = new DrawCanvasCircle(this);
        Bitmap result = Bitmap.createBitmap(25, 25, Bitmap.Config.ARGB_8888);
        canvas = new Canvas(result);
        pcc.draw(canvas);
        pcc.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT));
        ll.addView(pcc);
    }

    public static float convertDpToPixel(float dp, Context context) {
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float px = dp * (metrics.densityDpi / 160f);
        return px;
    }

    /**
     * This method converts device specific pixels to device independent pixels.
     * 
     * @param px
     *            A value in px (pixels) unit. Which we need to convert into db
     * @param context
     *            Context to get resources and device specific display metrics
     * @return A float value to represent db equivalent to px value
     */
    public static float convertPixelsToDp(float px, Context context) {
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float dp = px / (metrics.densityDpi / 160f);
        return dp;

    }

    class DrawCanvasCircle extends View {
        public DrawCanvasCircle(Context mContext) {
            super(mContext);
        }

        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Paint p = new Paint();
            p.setColor(Color.WHITE);
            DashPathEffect dashPath = new DashPathEffect(new float[] { 5, 5, 2,
                    2 }, (float) 1.0);

            p.setPathEffect(dashPath);
            p.setStyle(Style.STROKE);

            for (int i = 0; i < 25; i++) {
                canvas.drawCircle(pixelCenterX, pixelCenterY, pixelCenterY - 20
                        * i, p);
            }

            invalidate();
        }
    }

}

【问题讨论】:

  • 你的 convertdptopx() 方法做错了。你从 display.getHeight() 得到的实际上是 px。不是dp
  • 并且您还需要减去通知栏或标题栏的大小(如果有),以获得显示屏幕的确切高度和宽度。
  • 你能帮我在中心准确地画一个圆吗?如果我在不改变像素的情况下输入值也不能正确绘制。因为我对我的布局没有任何看法
  • @MBMJ 请停止提交一个字符的琐碎编辑。请参阅常见问题解答。

标签: android canvas


【解决方案1】:

好的,这里是link,供您获取状态栏和标题栏大小。

之后,您需要将它们减去:

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight() - statusHeight - titleHeight ;

ll = (LinearLayout) findViewById(R.id.ll);
float centerx = width / 2;
float centery = height / 2;

// you don't actually need to convert to Dp though, but if that is what you want then do it.
pixelCenterX = convertPixelToDp(centerx, this);
pixelCenterY = convertPixelToDp(centery, this);

祝你好运。

【讨论】:

  • 我的布局中没有任何其他内容,您可以通过将其应用于我的代码来查看我得到的内容..go to link
  • 不,您的布局确实由标题栏(CirclewithMaxRadius)和状态栏(时间)组成
  • 是的......现在当我从视图中删除两者时......现在在每个设备上正确绘图......谢谢
  • 是的,这就是我说的原因,如果它们在您的布局中,您需要计算它们。如果我的建议有帮助,请将其标记为答案 =)
【解决方案2】:

试试这个

public class TestSO extends Activity {
    /** Called when the activity is first created. */

    float pixelCenterX, pixelCenterY;
    DrawCanvasCircle pcc;
    LinearLayout ll;
    private Canvas canvas;
    private float centerX, centerY; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Display display = getWindowManager().getDefaultDisplay();
        int width = display.getWidth();
        int height = display.getHeight();
        ll = (LinearLayout) findViewById(R.id.ll);
        pixelCenterX = convertPixelsToDp(width, this) / 2;
        pixelCenterY = convertPixelsToDp(height, this) / 2;

        centerX = convertDpToPixel(pixelCenterX, this);
        centerY = convertDpToPixel(pixelCenterY, this);

        System.out.println("px..." + pixelCenterX);
        System.out.println("py..." + pixelCenterY);

        pcc = new DrawCanvasCircle(this);
        Bitmap result = Bitmap.createBitmap(25, 25, Bitmap.Config.ARGB_8888);
        canvas = new Canvas(result);
        pcc.draw(canvas);
        pcc.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT));
        ll.addView(pcc);
    }

    public static float convertDpToPixel(float dp, Context context) {
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float px = dp * (metrics.densityDpi / 160f);
        return px;
    }

    /**
     * This method converts device specific pixels to device independent pixels.
     * 
     * @param px
     *            A value in px (pixels) unit. Which we need to convert into db
     * @param context
     *            Context to get resources and device specific display metrics
     * @return A float value to represent db equivalent to px value
     */
    public static float convertPixelsToDp(float px, Context context) {
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float dp = px / (metrics.densityDpi / 160f);
        return dp;
    }

    class DrawCanvasCircle extends View {
        public DrawCanvasCircle(Context mContext) {
            super(mContext);
        }

        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Paint p = new Paint();
            p.setColor(Color.WHITE);
            DashPathEffect dashPath = new DashPathEffect(new float[] { 5, 5, 2,
                    2 }, (float) 1.0);

            p.setPathEffect(dashPath);
            p.setStyle(Style.STROKE);

            for (int i = 0; i < 25; i++) {
                canvas.drawCircle(centerX, centerY, pixelCenterY - 20
                        * i, p);
            }

            invalidate();
        }
    }

}

【讨论】:

  • 是的。但是没有转换它就不能在每个设备上正确绘制,因为我在 320x480 上使用 160dpi 分辨率进行了 drwan。但是在 1200x780 的标签上工作
  • 仍然无法从您的代码go to link中看到
  • 从宽度方向看它在中心,但从高度看它不是从高度侧看到大约接触的圆圈,底部只有 1 个圆圈,顶部只有 3 个圆圈
猜你喜欢
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多