[Android]如何在canvas上随机drawBitmap,并且每个bitmap都不会被重叠?

敲android还没多久,对于这种问题真的很苦手

我的思路是,定义一个Position类,里面有left top两个属性,再定义一个ArrayList数组,在每次random一个bitmap的坐标后,用Position对象存它的left top值,然后再遍历当前的ArrayList,如果新的坐标值和数组中的坐标值产生冲突(就是坐标在能与现有坐标重叠的范围内),我就返回false,重复上述步骤,一直到找到符合条件的坐标
代码是以下:

        Position zero = new Position(0, 0);
        positions.add(zero);
        Random random = new Random();
        int count = 0;
        while (count<index.length){//这个index是一个int数组
            int left = random.nextInt(screen_width-105);
            int topp = random.nextInt(screen_height-105);
            Position position = new Position(left, topp);
            if (position.isEmpty()) {
                canvas.drawBitmap(activity.imgs[count], left, topp,new Paint());
                count++;
                positions.add(position);
            }
        }

Position的定义是这样的:

class Position{
        private int left;
        private int top;
        public Position(int left, int top){
            this.left = left;
            this.top = top;
        }
        public int getLeft(){return left;}
        public int getTop(){return top;}
        public void setLeft(int left){
            this.left = left;
        }
        public void setTop(int top){
            this.top = top;
        }
            //获取屏幕的
        public boolean isEmpty(){//每张图片大小都是105*105,
            if (top<438||top>245){return false;}//这里是禁止绘制区域
            for (Position p : positions){
                if (top<438||top>245){
                    return false;
                }else if (
                                        left>(p.left-120)&&
                                        left<(p.left+120)&&
                                        top>(p.top-120)&&
                                        top<(p.top+120)
                                        ){
                    return false;
                }

            }
            return true;
        }

运行是屏幕一片漆黑,就宛如我这个菜鸟脆弱的心。。。。
其实绘制出来过,但是还是好多重叠,后来我发现条件判断那儿好像不对,就把循环条件给改了,然后就黑了

yoroziyasakata
yoroziyasakata 好的,之所以条件判定重叠的时候可以绘制,而条件判定改过来,改成不可以重叠就黑屏,应该是random的随机性太大了,很多时候满足不了我需要的坐标点数,所以就一直在循环中无解,我改了思路,写了个函数,把屏幕“网格化”,然后生成一个网格的坐标列表,最后drawbitmap的时候在这个列表里面选就行了,虽然很死板,但是不会出错,不知道还有没有大神有更好的办法
6 个月之前 回复

1个回答

你用list存Rect就行了,rect里面有判断是否重叠,然后随机一个新的rect遍历判断

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
android canvas(bitmap)失败
目前使用canvas在surfaceview上画路径n需要对路径进行缩放处理n所以想把canvas画的图放在bitmap上进行缩放处理n但是n使用canvas(bitmap)后,画出来的点,并没有显示在bitmap上是什么原因呀
Android Canvas Bitmap
用Android Canvas Bitmap 绘图rn问题:rn 1 Canvas生成一个Bitmap时,这时候已经占内存了吗?还是往Bitmap上画东西的时候才分配内存?rn 如果占内存的话,Canvas生成一个Bitmap,最大能生成多大的Bitmap?rn 且如何控制所占的内存?rnrn 2 根据上面1的问题,我绘制一个内存极限最大的Bitmap,rn 想把这个Bitmap分区域绘制 然后输出到屏幕 如何实现???rnrn望各位高手不吝赐教 提供宝贵思路!!!!
Android—BitMap与Canvas学习笔记
Android—BitMap与Canvas学习笔记
<canvas>学习笔记——如何在<canvas>上显示图片
首先定义一张图片,例如: var bgPic=new Image();//bgPic是Image类 给出图片的路径: bgPic.src="./src/background.jpg";//给属性src赋值 加载图片: ctx.drawImage(bgPic,0,0,w,h);//ctx是场景,0,0是指定从什么位置开始加载图片,w,h指定了图片的宽高。
如何在Canvas上显示图片?
import java.applet.*;rnclass imagecanvas extends Canvasrn rnImage picture;rnrnimagecanvas()rn rn rnrnpublic void init()rn rn picture=getImage(getDocumentBase(),"home5.gif");//问题就出现在这里rn rnpublic void paint(Graphics g)rn rn g.drawString(picture,0,0,this);rn rnrnrnrnpublic class picture extends Appletrnrnpicturecanvas p;rnrnpublic void init()rn rn p=new picturecanvas();rn p.setSize(100,200);rn add(p);rn rnrnrnrn就是在图片初始化时,编译不过关:rnrnpublic void init()rn rn picture=getImage(getDocumentBase(),"home5.gif");//问题就出现在这里rn rnrn 这只是一段伪码,兄弟们看一看有什么问题?有什么解决方法?rn 谢谢指教!!!rnrn
canvas drawbitmap 图片失真问题
1280*800的图片,利用canvas drawbitmap 画图方法,质量参数设置为RGB_565,在1280*800机器全屏的时候图片显示正常,但是机器如果推出全屏模式,可用高度变为737的时候,图片显示失真效果很严重。但是在layout里面设置背景图片的话,就算尺寸变了,效果依旧看不出有严重失真。rn有了解的朋友吗?提个思路也行,谢谢啦。
随机生成多个rect并且不能重叠
要求如下:rn 1, 背景大小是固定的, 2000 * 2000rn 2, 在背景上最多可以指定32个rectrn 3, 每个rect最大不能超过背景大小,最小为100 * 100rn 4, 每个rect大小可以指定,也可以随机生成rn 5, 各rect之间不能有重叠的部分,但是边可以重叠rnrn现在假设有10个rect,其中3个已经指定好,并且保证这3个rect没有重叠的部分,另外7个用随机数生成(位置和大小)。rnrn我到现在还没有头绪,因为随机生成一个的话很可能与已有的重叠,如果用无限循环来判断的话很可能进入死循环,麻烦各位提供下思路。rn
如何在button上添加Bitmap?
HBITMAP hBitmap;rn CBitmap bmpTemp;rn bmpTemp.LoadBitmap(IDB_BITMAP4);rn hBitmap=(HBITMAP)bmpTemp;rn m_button.SetBitmap(hBitmap);rn而且我的按钮属性上已经钩了Bitmap (Style),为何按钮上还不出现IDB_BITMAP4图形?
问题:如何在button上加bitmap;
如题!
如何在标题栏上贴Bitmap
最好给出代码,谢谢高手指点!
如何在标题栏上显示BITMAP?
请问在标题栏上显示BITMA位图的方法。rn效果像瑞星的标题栏那样。rn最好附上原代码,谢谢!!!
如何在button上添加bitmap??
如何在button上添加bitmap??谢谢了
如何在一张BITMAP的一部分上画图?
Graphics g = Graphics.FromImage(bmp);这样的话就画在整张图上了。现在我想在这张BITMAP上分四次画图,从左上,左下,右上,右下依次画不同的图。怎么才能从这四部分创建一个Graphics对象?请各位赐教
如何在内存的bitmap上写字??
知道buffer,和width height,如何在上面写透明的字?
求多线程DrawBitmap同一个Bitmap的问题
创建一个Bitmap,rn多个线程同时DrawBitmap就存在问题了,rn求解决办法啊?rn如果使用synchronized,那么在DrawBitmap不同Bitmap时要浪费了效率。求如果在相同bitmap使用synchronized,不同bitmap就不用啊。求算法。
如何在Canvas上写汉字?
我用Canvas->TextOut()写汉字,但是总是有白色的背影!!rn如何才能避免出现白色的背影rn(备注,我在是在Form的Canvas上写的)
请问如何在 Panel 上使用 Canvas ???
请问如何在 Panel 上使用 Canvas ???
如何在canvas上添加光标
如何在canvas上添加光标
如何在canvas上输出文字
画圆什么的都可以rn那写字,即字符串如何输出到屏幕上亚?
【转载】如何在canvas上绘制椭圆?
转载不完整,可去原网址查看,此文章转载来自:脚本之家.    希望作者勿怪 HTML5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结。各种方法各有优缺,视情况选用。各方法的参数相同,感兴趣的朋友可以参考下 概述  HTML5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结。各种方法各有优缺,视情况选用。各方法的参数相同: 
如何在canvas上实现字体滚动?
如何在canvas上实现字体滚动,效果就像在form中的ticker一样?rn请高人指点,谢谢!
如何在canvas上动态画出label
本来上面问题中涉及到了这个问题,现在单独摘出来问一下rndelphi上可以在panel控件上可以拖上一个label,现在程序里如何实现?rn其他的控件,rnTwincontrol(xx).paintto(canvas.handle,x,y); 实现了,rnlabel父类bushiwincontrol,不知道如何实现?
如何在Canvas上自绘控件啊?
我在Canvas上自绘一个控件,可是Canvas总是方形的,我如果画个圆形的话,那周围四个角就有Canvas的底色。rn我想问的是,我该怎么做,才能直接改变Canvas的形状啊?rn在线等,高手赐教。。。
JNI:封装Android中Canvas类下的drawBitmap()函数问题请教!
请教:rn画位图在Android下实现方法为:rn[code=Java]rn // 从资源文件中生成位图 rn Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); rn // 绘图 rn canvas.drawBitmap(bitmap, 10, 10, paint); rn[/code]rnrn 现要用JNI封装Android中Canvas类下的drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 函数;rn[code=C/C++]rn//位图rnjobject CVMAndroidDC::GetResources()rnrn static jmethodID jmidGetResources=NULL;rn if(jmidGetResources==NULL)rn rn jclass jclsView=m_pJNIEnv->FindClass("android/view/View"); rn jmidGetResources=m_pJNIEnv->GetMethodID(jclsView, "getResources", "()Landroid/content/res/Resources;");rnrn m_pJNIEnv->DeleteLocalRef(jclsView); //回收rn rn return m_pJNIEnv->CallObjectMethod(m_jobjView, jmidGetResources); //return -> Resources rnrnrn//问题主要出在这一DecodeResource()函数的封装,---->LOG提示,GetMethodID:method not found:decodeResource(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;)rnrnjobject CVMAndroidDC::DecodeResource(int id)rnrn GetResources();rn rn static jmethodID jmidDecodeResource=NULL;rn if(jmidDecodeResource==NULL)rn rn jclass jclsBitmapFactory=m_pJNIEnv->FindClass("android/graphics/BitmapFactory");rn jmidDecodeResource=m_pJNIEnv->GetMethodID(jclsBitmapFactory, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;");rn rn m_pJNIEnv->DeleteLocalRef(jclsBitmapFactory); //回收rn rn/* return m_pJNIEnv->CallStaticObjectMethod(m_jobjBitmapFactory, jmidDecodeResource, m_jobjView, id); rn 当调用CallStaticObjectMethod时Eclipse会提示error: invalid conversion from '_jobject*' to '_jclass*'rn*/rn return m_pJNIEnv->CallObjectMethod(m_jobjBitmapFactory, jmidDecodeResource, m_jobjView, id); //return ->Static BitmaprnrnrnrnVOID CVMAndroidDC::DrawBitmap(int left, int top)rnrn static jmethodID jmidDrawBitmap=NULL;rn if(jmidDrawBitmap==NULL)rn rn jclass jclsCanvas=m_pJNIEnv->FindClass("android/graphics/Canvas");rn jmidDrawBitmap=m_pJNIEnv->GetMethodID(jclsCanvas, "drawBitmap", "(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V");rn m_pJNIEnv->DeleteLocalRef(jclsCanvas); //回收rn rn m_pJNIEnv->CallVoidMethod(m_jobjCanvas, jmidDrawBitmap, m_jobjBitmapFactory, (jfloat)left, (jfloat)top, m_jobjPaint);rnrn[/code]
Bitmap图像重叠问题
[img=https://img-bbs.csdn.net/upload/201708/28/1503907864_365964.png][/img]rnBitmap1是一个已存在的图像,我想用一个Bitmap2,用它来包含Bitmap1,能让Bitmap1在Bitmap2中位置可选,可以做到么。求大神帮忙。本人认真结帖,请看结帖率。
如何在winform上随机显示图片?
有10张100*100大小的图片,如何每间隔5秒像winform中添加一张图片显示出来(累加)rnrn条件:rnrn1、累加方式rnrn2、无固定方式显示(随便位置显示)rnrn3、追加图片显示的时候不能叠加已有的图片rnrn多谢各位
请教关于canvas(bitmap)上的问题
对于canvas(bitmap)rn为何我是用后再用canvas.drawxxx画出来的东西并不能保存在bitmap上面呢rn代码如下:rnrn c = holder.lockCanvas();rn c.drawBitmap(mbitmap,0,0,paint1);rn c.drawLine(oldPoint.getX(), oldPoint.getY(), currentPoint.getX(), currentPoint.getY(), paint2);rn holder.unlockCanvasAndPost(c);rnrn用的一个循环绘制 rn这样画出来的线段每次都只有最新的一条 以前的不应该也在bitmap上面么 怎么就没有显示呢
急急!!请问如何在CFormView上的Button上加bitmap
急急!!请问如何在CFormView上的Button上加bitmap???rn切记不是在Dialog上,哪位老大如果有例子可以mail给我rnyuanhaili@sina.com,多谢!rn一定给分!!!
android canvas画bitmap生成新的bitmap的问题
[code=java] Bitmap bitmap = Bitmap.createBitmap(bits[0].getWidth(),bits[0].getHeight(), Bitmap.Config.RGB_565);rn Canvas canvas = new Canvas(bitmap);rn canvas.drawBitmap(bits[0],0,0,null);rn iv.setImageBitmap(bitmap);[/code]rnrn请问下大家 canvas.drawBitmap() 横坐标纵坐标都定义成0了,为什么画图的时候y轴还是会根据createBitmap()传进去的height的变化而变化呀
Android开发者学习笔记——View、Canvas、bitmap
Android开发者学习笔记——View、Canvas、bitmap
android 截取canvas内容生成bitmap图片
//获取涂鸦板截屏 public Bitmap getBitmap() { Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); if(cur...
Android使用Bitmap、Canvas制作图片
转载请注明来源:http://blog.csdn.net/kjunchen/article/details/51794037 Android使用Bitmap、Canvas制作图片先看下效果图: 在开发中有时候需要生成报告图,我们就可以使用Bitmap、Canvas进行文字图片的绘制,从而生成各种各样的图片或报告。
android 画图 bitmap drawable canvas paint
android 画图 bitmap drawable canvas paint
Canvas与Bitmap画图的问题
这是自定义的一个View.做为涂鸦用的,两个问题,1.怎么把mBitmap放到画板中间,并且整个画板都可以执行画的操作,因为目前来说R.drawable.bg在左上角并且只能在图片上做画的操作,空白处不能。2.另一个是怎么作清除画板上的已经画的东西和撤销功能。知道的请说下,成分感谢rn代码如下:rnpublic class CanvasView extends View rnrn private Bitmap mBitmap;rn private Canvas mCanvas;rn private Path mPath;rn private Paint mBitmapPaint;rn private Paint mPaint;rnrn public CanvasView(Context c) rn super(c);rn mPaint = new Paint();rnrn mBitmap = BitmapFactory.decodeResource(getResources(),rn R.drawable.bg).copy(Bitmap.Config.ARGB_8888, true);rn // mBitmap = Bitmap.createBitmap(300, 400, Bitmap.Config.ARGB_8888);rn // mBitmap = Bitmap.createBitmap(mBitmap);rn //Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.bg);rn mBitmap = Bitmap.createBitmap(mBitmap , 0, 0, 300, 400);rnrn mCanvas = new Canvas(mBitmap);rn mPath = new Path();rn mBitmapPaint = new Paint(Paint.DITHER_FLAG);rnrn mPaint.setAntiAlias(true);rn mPaint.setDither(true);rn mPaint.setColor(0xff000000);rn mPaint.setStyle(Paint.Style.STROKE);rn mPaint.setStrokeJoin(Paint.Join.ROUND);rn mPaint.setStrokeCap(Paint.Cap.ROUND);rn mPaint.setStrokeWidth(5);rn rnrn @Overridern protected void onSizeChanged(int w, int h, int oldw, int oldh) rn super.onSizeChanged(w, h, oldw, oldh);rn rnrn @Overridern protected void onDraw(Canvas canvas) rn canvas.drawColor(0xFFFFFFFF);// set background colorrnrn canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);rnrn canvas.drawPath(mPath, mPaint);rn rn}
关于BITMAP,Canvas,SOCKET。。。。。。
可不可以把Canvas转换为BITMAP,,,如何用SERVER端的SOCKET发送BITMAP???
canvas 转换成bitmap
android里面 canvas 转换成bitmap
Canvas与Bitmap求解
求解:rn[code=Java]rn//bitmap为一个大图rn//Canvas crn//Handler handlerrn//ra为一个Runnable用来不断执行下面的操作rnbm = Bitmap.createBitmap(bitmap, 0, i*20, 480, 20);rnLog.w("draw", "draw ok " + i);rnc.save();rnc.drawBitmap(bm, 0, i * 20, paint);rni++;rnc.restore();rnhandler.postDelayed(ra, 10);rn[/code]rn循环执行上面的操作画出来的效果却如下:rn[img=http://hi.csdn.net/attachment/201111/24/2591050_1322121341xX04.jpg][/img]
关于android的Canvas(Bitmap)问题
[size=16px]rn小弟我刚学android程序开发,使用android studio开发工具。最新学习了一个在图片上涂鸦的小程序,但是发现程序不能运行。程序没有语法错误,只是用模拟器无法运行,显示“has stopped”,我把程序安装在手机也是闪退。后来检查是:canvas = new Canvas(o_Bitmap); 出问题。查了一个下午的资料,也找不出这里有什么错误,附上代码给各位大哥帮忙看看,谢谢!rn[/size]rnrn[size=16px]activity_main.xml[/size]rn[code=html]rnrnrnrn rn rn rn rn rn[/code]rnrn[size=16px]myHandWrite.java (自定义的组件)[/size]rn[code=java]rnpackage com.zhuneen.zhu_4_5;rnrnimport android.content.Context;rnimport android.graphics.Bitmap;rnimport android.graphics.BitmapFactory;rnimport android.graphics.Canvas;rnimport android.graphics.Color;rnimport android.graphics.Paint;rnimport android.util.AttributeSet;rnimport android.view.MotionEvent;rnimport android.view.View;rnrnpublic class myHandWrite extends View rn Paint paint = null; //定义画笔rn Bitmap originalBitmap = null; //存放原始图像rn Bitmap new1_Bitmap = null; //存放从原始图像复制的位图图像rn Bitmap new2_Bitmap = null; //存放处理后的图像rn float startX = 0, startY = 0; //画线的起点坐标rn float clickX = 0, clickY = 0; //画线的终点坐标rn boolean isMove=true; //设置是否画线的标记rn boolean isClear = false; //设置是否清除涂鸦的标记rn int color = Color.GREEN; //设置画笔的颜色(绿色)rnrn public myHandWrite(Context context, AttributeSet attrs) rn super(context, attrs);rn originalBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.cy);//从资源中获取原始图像rn new1_Bitmap = Bitmap.createBitmap(originalBitmap);//建立原始图像的位图rn rn public void clear() //清除涂鸦rn isClear = true;rn new2_Bitmap = Bitmap.createBitmap(originalBitmap);rn invalidate();rn rn @Overridern protected void onDraw(Canvas newCanvas) //显示绘图rn super.onDraw(newCanvas);rn newCanvas.drawBitmap(HandWriting(new1_Bitmap), 0, 0,null);rn rn public Bitmap HandWriting(Bitmap o_Bitmap)//记录绘制图形rn rn Canvas canvas;rn if(isClear)//创建绘制新图形的画布rn rn canvas = new Canvas(new2_Bitmap);//检查发现这条语句有问题,但是语法是正确的。rn rn else//创建绘制原图形的画布rn canvas = new Canvas(o_Bitmap);//检查发现这条语句有问题,但是语法是正确的。rn rn paint = new Paint();rn paint.setStyle(Paint.Style.STROKE);rn paint.setAntiAlias(true);rn paint.setColor(color);rn paint.setStrokeWidth(5);rn if(isMove) rn canvas.drawLine(startX, startY, clickX, clickY, paint);//在画布上画线条rn rn startX = clickX;rn startY = clickY;rn if(isClear)rn rn return new2_Bitmap;//返回新绘制的图像rn rn return o_Bitmap;//若清屏,则返回原图像rn rn @Overridern public boolean onTouchEvent(MotionEvent event)//定义触摸屏事件rn rn clickX = event.getX();//获取触摸坐标位置rn clickY = event.getY();rn if(event.getAction() == MotionEvent.ACTION_DOWN)//按下屏幕时无绘图rn rn isMove = false;rn invalidate();rn return true;rn rn else if(event.getAction() == MotionEvent.ACTION_MOVE)//记录在屏幕上划动的轨迹rn rn isMove = true;rn invalidate();rn return true;rn rn return super.onTouchEvent(event);rn rnrn[/code]rnrn[size=16px]MainActivity.java [/size]rn[code=java]rnpackage com.zhuneen.zhu_4_5;rnrnimport android.app.Activity;rnimport android.os.Bundle;rnimport android.view.View;rnimport android.widget.Button;rnrnpublic class MainActivity extends Activity rn private myHandWrite handWrite=null;rn private Button clear=null;rn @Overridern protected void onCreate(Bundle savedInstanceState) rn super.onCreate(savedInstanceState);rn setContentView(R.layout.activity_main);rn handWrite = (myHandWrite) findViewById(R.id.handwriteview);//关联View组件rn clear = (Button)findViewById(R.id.clear);rn clear.setOnClickListener(new mClick());rn rn private class mClick implements View.OnClickListenerrn rn public void onClick(View v) rn handWrite.clear();//清屏rn rn rnrnrn[/code]
Canvas和Bitmap的关系
Canvas和Bitmap的关系
Android上Bitmap文件解析示例
本文主要介绍的是Bitmap文件解析的一个简单示例,例子是在Androd上写的,用到的图像只有24位深度的这一种。Bitmap文件的基本结构参考: http://www.cnblogs.com/jerry-lin300/archive/2011/12/16/2233854.html例子中用到的原始Bitmap图片: 主要过程就是加载Bitmap图片进行解析,简单的灰度处理,转换成Android中
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件