我想在屏幕上绘制某些内容后清除画布的内容。
如何完全清除屏幕?上面的任何代码片段都会有所帮助。
谢谢。
这是我的代码:
public class Panel extends SurfaceView implements SurfaceHolder.Callback {
private ViewThread mThread;
private ArrayList<Element> mElements = new ArrayList<Element>();
public Panel(Context context, AttributeSet attrs) {
super(context, attrs);
this.setBackgroundColor(Color.TRANSPARENT);
this.setZOrderOnTop(true); //necessary
getHolder().setFormat(PixelFormat.TRANSPARENT);
getHolder().addCallback(this);
mThread = new ViewThread(this);
}
public void doDraw(Canvas canvas) {
super.onDraw(canvas);
//canvas.drawColor(Color.TRANSPARENT);
// canvas.drawColor(Color.argb(0, 255, 255, 255));
//canvas.drawColor(Color.rgb(-1, -1, -1));
//canvas.drawARGB(0, 255, 255, 255);
synchronized (mElements) {
for (Element element : mElements) {
element.doDraw(canvas);
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, …Run Code Online (Sandbox Code Playgroud) 我正在为我的任务开发一个android项目.我正在尝试制作一个临时图像应用程序,你知道它就像我们划伤屏幕去除阻挡层来显示图像.但问题是我不知道从哪里开始.
我在stackoverflow中搜索与此相关的问题,但这没有帮助.从我在那里搜索,我发现这个项目正在使用的线索Bitmap.getPixel(int x, int y).
所以,在我的想法中,我必须从位图获取像素并将其绘制到画布上.但我不知道如何实施它?或者有人有更好的方法吗?
有人可以帮帮我吗?有关此类事物或相关主题的任何教程吗?
提前致谢!
这是我的示例代码:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
tw = w;
th = h;
eraseableBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(eraseableBitmap);
Bitmap muteableBitmap = Bitmap.createBitmap(eraseableBitmap.getWidth(), eraseableBitmap.getHeight(), Bitmap.Config.ARGB_8888);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
static_x = event.getX();
static_y = event.getY();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
touch_start(static_x, static_y);
} if (event.getAction() == MotionEvent.ACTION_MOVE) {
touch_move(static_x, static_y);
} if (event.getAction() == …Run Code Online (Sandbox Code Playgroud) 我在 onDraw 函数中调用 getDrawingCache 。问题是它只在第一次包含对画布的更改,之后,它根本没有随着新的更改而更新。这是我的代码:
paintAction.draw(canvas);
if (paintAction.isPermanentChange())
{
Bitmap partialBitmap=getDrawingCache();
int numColored=0;
for (int index1=0;index1<partialBitmap.getWidth();index1++)
{
for (int index2=0;index2<partialBitmap.getHeight();index2++)
{
if (partialBitmap.getPixel(index1,index2)==0xFF000000)
numColored++;
}
}
Log.i("PaintDroid","Bitmap pixels: " + numColored);
int areaWidth=partialBitmap.getWidth()-SCROLLBAR_SIZE;
int areaHeight=partialBitmap.getHeight()-SCROLLBAR_SIZE;
int[] pixels=new int[areaWidth*areaHeight];
partialBitmap.getPixels(pixels,0,areaWidth,0,0,areaWidth,
areaHeight);
numColored=0;
for (int index=0;index<pixels.length;index++)
if (pixels[index]==0xFF000000) numColored++;
Log.i("PaintDroid","Pixels: " + numColored);
Run Code Online (Sandbox Code Playgroud)
(setDrawingCache(true) 在视图创建时被调用,因为如果我从 onDraw 调用它,getDrawingCache 将返回 null。)
可以看出,我通过遍历位图和获取数组中的值来计算黑色像素的数量,正如我所说,我第一次得到了我期望的数字,但在那之后,它应该增加,但根本没有改变!
有人知道出了什么问题吗?谢谢。
关于Android UI的问题.当我们使用XML-layout时,我们编写(例如)
setContentView(R.layout.main);
当我们使用2d-graphics时,我们会写
Draw2D d = new Draw2D(this);
setContentView(d);
那么如果我想同时使用两者呢?我需要使用layout-xml,屏幕的一部分是fir绘画(Canvas).我读到了关于surfaceView的内容,但是使用Canvas的简单方法呢?
我正在尝试创建一个半透明的帮助叠加层,以便在用户首次打开应用程序时显示在我的活动的主屏幕上。我想通过“剪切”与按钮位置相对应的覆盖层部分来突出显示主布局中包含的按钮(并使用 setContentView 进行膨胀),并使剪切部分透明。
覆盖层是一个以编程方式创建的视图(扩展了RelativeLayout),它被添加到我的活动的主FrameLayout中,如下所示:
private void addHelpOverlay(){
HelpOverlay help = new HelpOverlay(this);
help.setBackgroundColor(Color.parseColor("#BB222222"));
mainLayer.addView(help);
}
public class HelpOverlay extends RelativeLayout{
public HelpOverlay(Context context){
super(context);
}
@Override
public void dispatchDraw(Canvas canvas){
canvas.drawColor(Color.parseColor("#BB222222"));
Paint mPaint = new Paint();
mPaint.setColor(0xFFFFFF);
mPaint.setAlpha(0);
mPaint.setAntiAlias(true);
canvas.drawCircle(buttonX, buttonY, 100, mPaint);
super.dispatchDraw(canvas);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码实际上没有显示任何内容,只是没有圆形切口的半透明布局。我认为这是因为它只是在半透明布局的顶部绘制了一个透明的圆圈。我真的很努力实现这一目标,任何建议将不胜感激!
I'm implementing a zoomable View from examples I've found on Stack and other websites. I do want to add a drawing feature to the view. I'm able to get the paths to show up but the scaling is way off from the image behind it. I used an example android image where I traced along the shape and the paths appeared to the left and above it. Also, zooming causes it to shift (pictures below).
I've been playing around with …
我花了一些时间学习如何在 Android anno 2016 上创建 2D 渲染游戏循环。
我想实现以下目标:
关于 SurfaceView 的神话:
首先,有几篇文章推荐SurfaceView。乍一看,这似乎是个好主意,因为它使用单独的渲染线程,但事实证明,从 SurfaceHolder 返回的 Canvas无法进行硬件加速!在具有 QuadHD (2560x1440) 分辨率的设备上使用带有软件渲染的 SurfaceView 是非常低效的。
因此我的选择是扩展一个基本的 View 并覆盖 onDraw()。为每次更新调用 invalidate()。
流畅的动画:
我的下一个挑战是流畅的动画。事实证明,在 onDraw() 中读取 System.nanoTime() 是一个坏主意,因为它不会以精确的 1/60 秒间隔被调用,从而在我的精灵上产生生涩的动作。因此,我使用Choreographer为我提供每个 VSYNC 的帧时间。这很好用。
现在的进展:
我觉得我已经非常接近了,但我仍然偶尔会在旧设备上遇到一些滞后。内存使用率非常低,所以我不认为 GC 是背后的原因......似乎我的回调偶尔会错过/跳转 aoad 帧。
我会发布我的代码,我期待着阅读您的评论和建议。
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v4.content.res.ResourcesCompat;
import android.util.AttributeSet;
import android.view.Choreographer;
import android.view.View;
public class MiniGameView extends View implements Choreographer.FrameCallback …Run Code Online (Sandbox Code Playgroud) android.graphics.Paint内存是重物吗?哪个更有效,将绘制对象引用传递给需要在画布上绘制并在这些类中设置绘制属性(例如颜色、样式等)的类,或者在需要的任何地方创建新的 Paint 对象?
我整晚都在试图解决这个问题,但在 Google 上找到的答案与有关 Android 画布的非常具体的问题有关,我还没有找到关于这个主题的 101 条解释。甚至 Android 文档也使用位图而不是绘制形状。
具体问题:
我需要在画布上绘制一个椭圆形和一条路径。并根据文档颜色源出一种颜色,目的地出另一种颜色和重叠区域,源入或目的地入,第三种颜色。我正在尝试在屏幕外画布中完成所有这些。但是上面的一些步骤会出现问题,并且在尝试以任何方式组合它们时会变得更糟。
代码 -
Bitmap bmp = Bitmap.CreateBitmap (720, 720, Bitmap.Config.Argb8888);
Canvas c = new Canvas (bmp);
Paint paint = new Paint ();
paint.SetARGB (255, 255, 0, 0);
c.DrawOval (200, 200, 520, 520, paint); //assumed destination
paint.SetARGB (255, 0, 0, 255);
paint.SetXfermode (new PorterDuffXfermode (PorterDuff.Mode.*)); //replace mode here
paint.SetStyle (Paint.Style.Fill);
Path path = new Path ();
path.MoveTo (c.Width / 2f, c.Height / 2f);
foreach (var m in measurements) { …Run Code Online (Sandbox Code Playgroud)我正在通过扩展创建自定义视图 android.view.View.
现在,我需要在低于 21 的 API 级别上绘制一个圆角矩形。Android 有一个内置的方法名称drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)in android.graphics.Canvas,但它不支持低于 21 的 API,但我需要在 API 16 上绘制它。我怎样才能做到这一点?
提前致谢
android ×10
android-canvas ×10
android-view ×2
surfaceview ×2
2d ×1
bitmap ×1
java ×1
layout ×1
ondraw ×1
performance ×1
pinchzoom ×1
xamarin ×1
xml ×1