我有一个具有以下视图结构的游戏应用程序.首先,我有一个空的FrameLayout,如下所示:
FrameLayout game_frame_layout = new FrameLayout(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
然后我像这样添加两个视图:
game_frame_layout.addView(customView);
game_frame_layout.addView(butView);
Run Code Online (Sandbox Code Playgroud)
customView用于显示各种移动的游戏图形,而butView在移动的图形上显示一些ImageButtons.customView是一个扩展SurfaceView的类CustomView的实例.
CustomView包含以下代码
void updateView()
{
final SurfaceHolder holder = getHolder();
holder.setFormat(PixelFormat.RGBA_8888);
try
{
Canvas canvas = holder.lockCanvas();
if (canvas != null)
{
onDraw(canvas);
holder.unlockCanvasAndPost(canvas);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
这条线holder.setFormat(PixelFormat.RGBA_8888);是最近添加的(见这里).没有那条线,我的动画图形看起来是一种颜色太少的格式(通过实验我推断它是"RGB_565"),所以我得到了一些条带文物.当我添加setFormat线时,我的三星Galaxy Tab 10.1(Android 3.1)上的图形显示完美(没有条带)......但在其他三个设备上:三星GT-l9100(4.1.2),一个Nexus 7 ME370T 4.4 .2和HTC One X 4.2.2我只看到与完全黑色背景相对应的按钮.日志中没有迹象表明程序已崩溃.
有任何想法吗?
我需要绘制三角形,梯形,五边形,平行四边形,菱形等多边形.看起来Path类是要走的路,但是我需要这些多边形有圆角,我还需要控制圆角的数量.
令我惊讶的是,我刚刚发现drawLine和drawRect不包括结束位置,即:
canvas.drawLine(100, 100, 100, 100, paint);
Run Code Online (Sandbox Code Playgroud)
要么
RectF rect = new RectF(100, 100, 100, 100);
canvas.drawRect(rect, paint);
Run Code Online (Sandbox Code Playgroud)
不会画任何东西.
我的油漆定义如下:
Paint paint = new Paint();
paint.setAntiAlias(false);
paint.setStyle(Paint.Style.FILL);
return paint;
Run Code Online (Sandbox Code Playgroud)
我已经尝试将我的绘画定义为FILL_AND_STROKE,但它无济于事.
Android的drawPaint()javadoc甚至没有列出stopX和stopY参数!
所以,如果我想绘制一条完全从beginY到endY(包括)的垂直线,我必须执行以下操作:
canvas.drawLine(constX, beginY, constX, endY + 1)
Run Code Online (Sandbox Code Playgroud)
请注意,我没有将1添加到结束X位置,仅添加到结尾Y(xstays与我想要的垂直线相同).
我的设备是HTC SENSE.
编辑:西蒙,你是对的,而不是问一个问题,我只是试图分享我的惊讶,因为Android在基本的绘图这样的基本情况下没有做文档所说的,并且确保我没有'在我的路上做任何愚蠢的错误.
为了让自己更清楚:drawRect的javadoc说:
public void drawRect(float left,float top,float right,float bottom,Paint paint)
使用指定的绘制绘制指定的Rect.矩形将根据绘画中的样式填充或加框.
left - 要绘制的矩形的左侧
top - 要绘制的矩形的顶边
right - 要绘制的矩形的右侧
bottom - 要绘制的矩形的底边
paint - 用于绘制rect的绘画
所以,写作时
canvas.drawRect(x1, y1, x2, y2)
Run Code Online (Sandbox Code Playgroud)
你期望一个角落在(x1,y1)的矩形; (x1,y2); (x2,y1)和(x2,y2).
Android说:错了!他们将在(x1,y1); (x1,y2-1); (x2-1,y1)和(x2-1,y2-1).
对于好奇的:设置画布剪辑:
canvas.clipRect(x1, y1, …Run Code Online (Sandbox Code Playgroud) 我有DrawView.如果我触摸此视图,则会绘制小圆圈.我不会画圆圈但不会触摸视图 - 使用帮助功能"setPoints".我所做的:
package com.samples;
import ...
public class DrawView extends View {
ArrayList<Point> points = new ArrayList<Point>();
Paint paint = new Paint();
private int pSize = 5;
private int pColor = Color.BLACK;
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.setOnTouchListener(this);
Point point = new Point();
point.x = event.getX();
point.y = event.getY();
points.add(point);
invalidate();
}
return true;
}
});
requestFocus();
}
@Override
public void onDraw(Canvas canvas) …Run Code Online (Sandbox Code Playgroud) 我使用下面的代码在位图画布上绘制线条,同时手指触摸移动...这里我发布了部分代码,它工作正常..
如下图所示,黑色和白色位图在触摸拖动时被擦除.我使画布透明,因此父版面背景(彩色图像)变得可见.
我想知道,删除了多少区域(比如50%或60%的位图)..有什么方法可以找到它吗?

//Erasing paint
mDrawPaint = new Paint();
mDrawPaint.setAntiAlias(true);
mDrawPaint.setDither(true);
mDrawPaint.setStyle(Paint.Style.STROKE);
mDrawPaint.setStrokeJoin(Paint.Join.ROUND);
mDrawPaint.setStrokeCap(Paint.Cap.ROUND);
mDrawPaint.setStrokeWidth(50);
mDrawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
BlurMaskFilter mBlur = new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL);
mDrawPaint.setMaskFilter(mBlur);
Run Code Online (Sandbox Code Playgroud)
private void doDraw(Canvas c) {
c.drawBitmap(mBitmap, 0, 0,null );
}
Run Code Online (Sandbox Code Playgroud)
private float mX, mY;
private static final float TOUCH_TOLERANCE = 1;
void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}
void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Android应用程序,应该允许用户在画布上绘制一个圆圈并拖动它.我已经能够在上面绘制线条和圆圈.但我似乎无法拖动它.
是否可以在Android中拖动画布上绘制的对象?例如,如果我在圆圈内检测到触摸,如何从先前位置删除圆圈并将其移动到当前位置?我试过了invalidate().但是如果用户绘制了多个圆圈并想要移动它们,它就无法工作.
在我的应用程序中,我在Android上绘制文字Canvas;
我们支持underline和bold我正在喷漆的对象的帮助;
Paint paint = new Paint();
paint.setUnderlineText(true);
paint.setFakeBoldText(true);
paint.setColor(color);
paint.setTextSize (font_size);
canvas_obj.drawText(text,x,y,paint);
Run Code Online (Sandbox Code Playgroud)
通过这段代码,我得到了粗体和带下划线的文字;
我也喜欢这样做italic,
我正在为Android 2.2开发应用程序.
怎么做?
编辑:
我正在设置使用外部字体文件创建的Typeface对象以支持外部字体; 对于Italic我使用以下代码
paint.setTypeface(Typeface.create(external_font_type_face,Typeface.ITALIC));
Run Code Online (Sandbox Code Playgroud)
这也行不通,测试三星Galaxy Ace(android 2.2)
我创建了一个圆形按钮,可以在调用函数时更改颜色.我想要的是创建另一个,创建相同的圆形按钮,但径向渐变从中间开始选择颜色,当你离开圆圈时,它会变为透明.
我使用在如何设置渐变样式来绘制对象时发布了一个类似的代码?但是没有用.
我尝试的代码是这个porpuse是:
mPaint.setShader(new RadialGradient(0, 0, height/3, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.MIRROR));
Run Code Online (Sandbox Code Playgroud)
以下类是我为圆形按钮创建的类.
public class ColorGradientCircleButton extends View{
private Paint mPaint;
private Paint mBitmapPaint;
private Bitmap mBitmap;
private Canvas mCanvas;
private int width, height;
public ColorGradientCircleButton(Context context) {
super(context);
init();
}
public ColorGradientCircleButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ColorGradientCircleButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(1);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mBitmapPaint = new …Run Code Online (Sandbox Code Playgroud) 我目前正在webview图像(下面的大象)上实现绘图功能.我没有绘制它的问题,但缩放功能在绘图上做了一些时髦的东西(下面的第2张图片).当我放大时,绘图不会缩放而是转换.缩放绘图也不起作用.我的代码如下:


@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
canvas.scale(mScaleFactor, mScaleFactor);
canvas.restore();
clipBounds = canvas.getClipBounds();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mScaleDetector.onTouchEvent(event);
float touchX = event.getX() / mScaleFactor + clipBounds.left;
float touchY = event.getY() / mScaleFactor + clipBounds.top;
if (Deal.on)
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
else {
super.onTouchEvent(event);
}
invalidate();
return true;
}
public class …Run Code Online (Sandbox Code Playgroud) 我是Android开发的新手,我发现很难在camera2 api上找到好的例子.
我在大多数问题上慢慢地工作,但在这个问题上,我被困住了.在默认相机中,当您触摸屏幕进行对焦时,它会暂时显示焦点区域的矩形.我想做类似的事情(或者在这种情况下,完全相同的事情开始,所以我可以弄明白).
我在某处看到(我认为SDK文档中的TextureView页面),当它被用作相机预览时,你无法在textureview上绘制 - 并且调用lock方法将返回null而不是画布.
我在网上找到了这个:https://github.com/commonsguy/vidtry/ 但我无法让它工作.我或者得到错误说我的主视图不能投射到我的可绘制视图,反之亦然 - 或者我的可绘制视图位于顶部并使屏幕变黑 - 或者它在底部并且不会响应触摸事件(并试图强制从上面的视图中执行点击它会导致崩溃.)
我卡住了!任何人都可以给我一个解释或示例,说明如何在事件位置上绘制矩形几秒钟?
谢谢!
android android-layout android-camera android-canvas textureview
android ×10
android-canvas ×10
android-view ×1
draw ×1
drawing ×1
italic ×1
paint ×1
polygon ×1
text ×1
textureview ×1
view ×1