标签: android-canvas

SurfaceHolder.setFormat(PixelFormat.RGBA_8888)在某些设备上失败,而在其他设备上失败

我有一个具有以下视图结构的游戏应用程序.首先,我有一个空的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我只看到与完全黑色背景相对应的按钮.日志中没有迹象表明程序已崩溃.

有任何想法吗?

android android-canvas

15
推荐指数
1
解决办法
3414
查看次数

如何在Android画布上绘制圆角多边形?

我需要绘制三角形,梯形,五边形,平行四边形,菱形等多边形.看起来Path类是要走的路,但是我需要这些多边形有圆角,我还需要控制圆角的数量.

android polygon rounded-corners android-canvas

15
推荐指数
1
解决办法
6350
查看次数

画布'drawLine和drawRect不包括结束位置?

令我惊讶的是,我刚刚发现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)

android drawing paint android-canvas

14
推荐指数
1
解决办法
7964
查看次数

如何获得当前的画布?

我有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)

android view android-canvas

14
推荐指数
1
解决办法
3万
查看次数

如何在画布android上绘制路径时覆盖总面积?

我使用下面的代码在位图画布上绘制线条,同时手指触摸移动...这里我发布了部分代码,它工作正常..

如下图所示,黑色和白色位图在触摸拖动时被擦除.我使画布透明,因此父版面背景(彩色图像)变得可见.

我想知道,删除了多少区域(比如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 draw android-canvas

14
推荐指数
2
解决办法
4518
查看次数

拖动并移动画布上绘制的圆圈

我正在开发一个Android应用程序,应该允许用户在画布上绘制一个圆圈并拖动它.我已经能够在上面绘制线条和圆圈.但我似乎无法拖动它.

是否可以在Android中拖动画布上绘制的对象?例如,如果我在圆圈内检测到触摸,如何从先前位置删除圆圈并将其移动到当前位置?我试过了invalidate().但是如果用户绘制了多个圆圈并想要移动它们,它就无法工作.

android android-canvas

14
推荐指数
1
解决办法
3万
查看次数

如何在Android画布上绘制斜体文字?

在我的应用程序中,我在Android上绘制文字Canvas;

我们支持underlinebold我正在喷漆的对象的帮助;

 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)

android text italic android-canvas

14
推荐指数
1
解决办法
1万
查看次数

如何在画布中绘制具有径向渐变的圆?

我创建了一个圆形按钮,可以在调用函数时更改颜色.我想要的是创建另一个,创建相同的圆形按钮,但径向渐变从中间开始选择颜色,当你离开圆圈时,它会变为透明.

我使用在如何设置渐变样式来绘制对象时发布了一个类似的代码但是没有用.

我尝试的代码是这个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)

android android-canvas android-view

14
推荐指数
1
解决办法
2万
查看次数

画布 - 在Android上放大,移动和缩放

我目前正在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 android-canvas

14
推荐指数
1
解决办法
2万
查看次数

Android SDK - camera2 - 在TextureView上绘制矩形

我是Android开发的新手,我发现很难在camera2 api上找到好的例子.

我在大多数问题上慢慢地工作,但在这个问题上,我被困住了.在默认相机中,当您触摸屏幕进行对焦时,它会暂时显示焦点区域的矩形.我想做类似的事情(或者在这种情况下,完全相同的事情开始,所以我可以弄明白).

我在某处看到(我认为SDK文档中的TextureView页面),当它被用作相机预览时,你无法在textureview上绘制 - 并且调用lock方法将返回null而不是画布.

我在网上找到了这个:https://github.com/commonsguy/vidtry/ 但我无法让它工作.我或者得到错误说我的主视图不能投射到我的可绘制视图,反之亦然 - 或者我的可绘制视图位于顶部并使屏幕变黑 - 或者它在底部并且不会响应触摸事件(并试图强制从上面的视图中执行点击它会导致崩溃.)

我卡住了!任何人都可以给我一个解释或示例,说明如何在事件位置上绘制矩形几秒钟?

谢谢!

android android-layout android-camera android-canvas textureview

14
推荐指数
1
解决办法
1万
查看次数