看了许多例子,发现在android中画图,基本都开启一个线程,大致是这样的:
在主界面的onCreate方法中有这样的代码:
super.onCreate(savedInstanceState);
mGameView = new GameView(this); //GameView是自定义的一个类,继承自View,实现Runnable接口
setContentView(mGameView);
在GameView.java中有这样的代码:
public GameView(Context context)
{
super(context);
mPaint = new Paint();
new Thread(this).start(); //开启线程绘图
}
public void onDraw(Canvas canvas)
{
.......
}
public void run()
{
......
}
大致就是以上的一个结构。我现在想在android界面中同时绘制两个图形(开启两个子线程分别绘制),屏幕上方绘制一个矩形,屏幕下方绘制一个圆形,要实现这样的一个程序大致要怎么做呢,我看setContentView中的参数只是一个view,不能做到两个view,有什么其他的办法吗
------解决方案--------------------
同时操作UI会有冲突,由于显示的只能有一个UI线程来操作,不过可以用类似于消息机制的Holder处理
------解决方案--------------------
一个一个的画,当你这个画完,handler通知另一个开始画。
------解决方案--------------------
同时画在同一个View上?这是不行的楼主!因为android的UI控件使非线程安全的,只允许UI线程操作UI控件,所以你创建再多的线程也白搭!
如果需要画的东西不是很复杂的话,没必要使用多线程!
如果画的东西很复杂的话(要画很久),你就专门用一个线程画到单独BMP上,然后通过UI线程往View上贴(这个耗时不多,只是内存拷贝而已)
------解决方案--------------------
可以定制2个VIEW来画啊 , setContentView是只可以指定一个
但是可以定制一个布局 , 然后在用布局把这2个View都加进去不就好了。
还有 , 如果说是在View中画2个不同的形状的图案也不用2个线程 , 只需要写2个绘制图的方法就可以了。
------解决方案--------------------
------解决方案--------------------
有个这样的demo,楼主可以研究研究
- Java code
public class Arcs extends GraphicsActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); } private static class SampleView extends View { private Paint[] mPaints; private Paint mFramePaint; private boolean[] mUseCenters; private RectF[] mOvals; private RectF mBigOval; private float mStart; private float mSweep; private int mBigIndex; private static final float SWEEP_INC = 2; private static final float START_INC = 15; public SampleView(Context context) { super(context); mPaints = new Paint[4]; mUseCenters = new boolean[4]; mOvals = new RectF[4]; mPaints[0] = new Paint(); mPaints[0].setAntiAlias(true); mPaints[0].setStyle(Paint.Style.FILL); mPaints[0].setColor(0x88FF0000); mUseCenters[0] = false; mPaints[1] = new Paint(mPaints[0]); mPaints[1].setColor(0x8800FF00); mUseCenters[1] = true; mPaints[2] = new Paint(mPaints[0]); mPaints[2].setStyle(Paint.Style.STROKE); mPaints[2].setStrokeWidth(4); mPaints[2].setColor(0x880000FF); mUseCenters[2] = false; mPaints[3] = new Paint(mPaints[2]); mPaints[3].setColor(0x88888888); mUseCenters[3] = true; mBigOval = new RectF(40, 10, 280, 250); mOvals[0] = new RectF( 10, 270, 70, 330); mOvals[1] = new RectF( 90, 270, 150, 330); mOvals[2] = new RectF(170, 270, 230, 330); mOvals[3] = new RectF(250, 270, 310, 330); mFramePaint = new Paint(); mFramePaint.setAntiAlias(true); mFramePaint.setStyle(Paint.Style.STROKE); mFramePaint.setStrokeWidth(0); } private void drawArcs(Canvas canvas, RectF oval, boolean useCenter, Paint paint) { canvas.drawRect(oval, mFramePaint); canvas.drawArc(oval, mStart, mSweep, useCenter, paint); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.WHITE); drawArcs(canvas, mBigOval, mUseCenters[mBigIndex], mPaints[mBigIndex]); for (int i = 0; i < 4; i++) { drawArcs(canvas, mOvals[i], mUseCenters[i], mPaints[i]); } mSweep += SWEEP_INC; if (mSweep > 360) { mSweep -= 360; mStart += START_INC; if (mStart >= 360) { mStart -= 360; } mBigIndex = (mBigIndex + 1) % mOvals.length; } invalidate(); } }}