在 Android 中绘制可重复使用的图像
Drawing a ReUsable Image in Android
我想在Android
中绘制这样的图像
我尝试使用设计工具设计图像并将其用作 Drawable,但它在 android 中变得像素化。
我用UIBezierPath
画在iOS app
里。是否有可能在 Android 上实现同样的目标?
这是我使用 XML <layer-list> drawable tag
:
实现的
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:height="30dp" android:gravity="top">
<shape android:shape="oval">
<solid android:color="@color/grey" />
</shape>
</item>
<item android:top="30dp" android:bottom="30dp" android:height="100dp" android:width="10dp">
<shape android:shape="rectangle">
<solid android:color="@color/black" />
</shape>
</item>
<item android:height="30dp" android:gravity="bottom">
<shape android:shape="oval">
<solid android:color="@color/white" />
</shape>
</item>
并尝试使用 Paint and Canvas
public class CircleLineImage extends View{
//Setup initial color
private int paintColor = Color.BLACK;
//Defines paint and canvas
private Paint drawPaint;
public CircleLineImage(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
setFocusableInTouchMode(true);
setupPaint();
}
private void setupPaint() {
drawPaint = new Paint();
drawPaint.setColor(paintColor);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(5);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawCircle(0, 0, 10, drawPaint);
canvas.drawLine(5, 10, 12, 200, drawPaint);
canvas.drawCircle(0, 220, 20, drawPaint);
}
}
谢谢。
不同的屏幕密度需要不同尺寸的图像。如果可绘制对象只是 png 或 jpg,并且 drawable-hdpi 文件夹中只有一张图像,那么当您使用密度为 xxhdpi (Nexus 5) 的设备的应用程序时,图像会按比例放大。尝试制作不同大小的可绘制对象并将它们添加到不同的 android 资源文件夹。
- drawable-mdpi(这将是基线,将此大小设置为 ImageView 的 dp)
- drawable-hdpi(1.5 x 基线)
- drawable-xhdpi(2 x 基线)
- drawable-xxhdpi(3 x 基线)
- drawable-xxxhdpi(4 x 基线)
在 android 教程中查看更多内容:http://developer.android.com/guide/practices/screens_support.html
请拿笔和纸,尝试画出您在 canvas 上想做的事情。 笔和纸仍然是掌握你想做的事情的最佳选择。
内容
你有 2 个椭圆和中间的一条线。它们都对齐相同的 x-Axis 值。 您的 draw*
调用中的 x 值应该没有变化。
绘画
drawPaint.setStyle(Paint.Style.STROKE);
不会填写。要填充圆圈,您需要在绘画对象上设置 FILL
。
剪掉圆圈
你的圈子被切断了,因为你正在 canvas 之外尝试。同样,只要画出草图,您的视图和 canvas 就有宽度和高度,使用它们!不要只是为你的界限假设任意值。
所以...
去计算你的 canvas 的中心(例如 canvas.width() / 2
)。对于 y 值均匀分布而不是硬编码也是如此。
更好的解决方案如下所示:
@Override
protected void onDraw(Canvas canvas) {
drawPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(centerX, 30, 20, drawPaint);
canvas.drawCircle(centerX, 170, 20, drawPaint);
drawPaint.setStyle(Paint.Style.STROKE);
canvas.drawLine(centerX, 50, centerX, 150, drawPaint);
}
我想在Android
中绘制这样的图像我尝试使用设计工具设计图像并将其用作 Drawable,但它在 android 中变得像素化。
我用UIBezierPath
画在iOS app
里。是否有可能在 Android 上实现同样的目标?
这是我使用 XML <layer-list> drawable tag
:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:height="30dp" android:gravity="top">
<shape android:shape="oval">
<solid android:color="@color/grey" />
</shape>
</item>
<item android:top="30dp" android:bottom="30dp" android:height="100dp" android:width="10dp">
<shape android:shape="rectangle">
<solid android:color="@color/black" />
</shape>
</item>
<item android:height="30dp" android:gravity="bottom">
<shape android:shape="oval">
<solid android:color="@color/white" />
</shape>
</item>
并尝试使用 Paint and Canvas
public class CircleLineImage extends View{
//Setup initial color
private int paintColor = Color.BLACK;
//Defines paint and canvas
private Paint drawPaint;
public CircleLineImage(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
setFocusableInTouchMode(true);
setupPaint();
}
private void setupPaint() {
drawPaint = new Paint();
drawPaint.setColor(paintColor);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(5);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawCircle(0, 0, 10, drawPaint);
canvas.drawLine(5, 10, 12, 200, drawPaint);
canvas.drawCircle(0, 220, 20, drawPaint);
}
}
谢谢。
不同的屏幕密度需要不同尺寸的图像。如果可绘制对象只是 png 或 jpg,并且 drawable-hdpi 文件夹中只有一张图像,那么当您使用密度为 xxhdpi (Nexus 5) 的设备的应用程序时,图像会按比例放大。尝试制作不同大小的可绘制对象并将它们添加到不同的 android 资源文件夹。
- drawable-mdpi(这将是基线,将此大小设置为 ImageView 的 dp)
- drawable-hdpi(1.5 x 基线)
- drawable-xhdpi(2 x 基线)
- drawable-xxhdpi(3 x 基线)
- drawable-xxxhdpi(4 x 基线)
在 android 教程中查看更多内容:http://developer.android.com/guide/practices/screens_support.html
请拿笔和纸,尝试画出您在 canvas 上想做的事情。 笔和纸仍然是掌握你想做的事情的最佳选择。
内容
你有 2 个椭圆和中间的一条线。它们都对齐相同的 x-Axis 值。 您的 draw*
调用中的 x 值应该没有变化。
绘画
drawPaint.setStyle(Paint.Style.STROKE);
不会填写。要填充圆圈,您需要在绘画对象上设置 FILL
。
剪掉圆圈
你的圈子被切断了,因为你正在 canvas 之外尝试。同样,只要画出草图,您的视图和 canvas 就有宽度和高度,使用它们!不要只是为你的界限假设任意值。
所以...
去计算你的 canvas 的中心(例如 canvas.width() / 2
)。对于 y 值均匀分布而不是硬编码也是如此。
更好的解决方案如下所示:
@Override
protected void onDraw(Canvas canvas) {
drawPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(centerX, 30, 20, drawPaint);
canvas.drawCircle(centerX, 170, 20, drawPaint);
drawPaint.setStyle(Paint.Style.STROKE);
canvas.drawLine(centerX, 50, centerX, 150, drawPaint);
}