android 浅复制和深复制-clone篇
有关java中的 浅复制和深复制,这里不详细讨论。相关知识请参考以下帖子:
浅复制和深复制https://blog.csdn.net/yang_hui1986527/article/details/7029777
浅析Java中的深拷贝与浅拷贝https://blog.csdn.net/yang_hui1986527/article/details/7012428
android中的 浅复制和深复制,具体可能于java中的有一点不同。下面,我们来探讨下在这个问题。
主要思路:
1、创建TextBox,然后根据TextBox复制出一个对象TextBox2(点击屏幕,进行复制);
2、改变TextBox2的位置,方便观察比较差异。
3、改变TextBox2内部文本的位置。如果是浅复制,那么TextBox2内部文本改变位置的同时,TextBox内部文本的位置会随着改变。否则,如果是深度复制,TextBox内部文本的位置不会改变。
效果如下:
注:请注意文本“test”在文本框内的位置。
浅复制:


深复制:


源程序:
CloneActivity.java
package com.clone; import android.app.Activity; import android.os.Bundle; public class CloneActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); CloneView mCloneView = new CloneView(this); setContentView(mCloneView); } }
CloneView.java
package com.clone; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class CloneView extends View { private Document mDocument = null; public Paint mPaint= null; public TextBox mTextBox = null; public TextBox mTextBox2 = null; public CloneView(Context context) { super(context); mDocument = new Document(); mPaint = new Paint(); initData(); } public CloneView(Context context, AttributeSet attrs) { super(context, attrs); mDocument = new Document(); mPaint = new Paint(); initData(); } public CloneView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mDocument = new Document(); } public void initData() { PointF textpos = new PointF(30,30); String text = new String("test"); mTextBox = new TextBox(50, 50, 100, 100, textpos, text); mDocument.add(mTextBox); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE); mDocument.draw(canvas, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { try { mTextBox2 = (TextBox)mTextBox.clone(); mTextBox2.moveBound(); mTextBox2.changeData(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } if(mTextBox2 != null) mDocument.add(mTextBox2); } invalidate(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; default: break; } return super.onTouchEvent(event); } }
Document.java
package com.clone; import java.util.Vector; import android.graphics.Canvas; import android.graphics.Paint; public class Document { private Vector<Object> objs = null; public Document() { objs = new Vector<Object>(); } public void add(Object obj){ objs.add(obj); } void draw(Canvas canvas, Paint paint) { canvas.save(); for (int i = 0; i < objs.size(); i++) { Object obj = objs.get(i); obj.draw(canvas, paint); } canvas.restore(); } }
Object.java
package com.clone; import android.graphics.Canvas; import android.graphics.Paint; public abstract class Object implements Cloneable{ protected float posx = 0; protected float posy =0; protected float width = 0; protected float height = 0; public Object() { posx = 0; posy =0; width = 0; height = 0; } public Object(float posx,float posy,float width,float height){ this.posx = posx; this.posy = posy; this.width = width; this.height = height; } public void moveBound() { this.posx += 100; this.posy += 100; } abstract void draw(Canvas canvas,Paint paint); abstract void changeData(); public Object clone() throws CloneNotSupportedException { return (Object) super.clone(); } }
TextBox.java
package com.clone; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.PointF; public class TextBox extends Object implements Cloneable{ private PointF mtextpos = null; private String mtextString = null; public TextBox() { posx = 0; posy =0; width = 0; height = 0; mtextpos = new PointF(); mtextString = new String(); } public TextBox(float posx, float posy, float width, float height,PointF textpos,String text) { this.posx = posx; this.posy = posy; this.width = width; this.height = height; mtextpos = new PointF(textpos.x,textpos.y); mtextString = new String(text); } @Override void draw(Canvas canvas, Paint paint) { canvas.save(); paint.setColor(Color.BLUE); paint.setStyle(Style.STROKE); canvas.drawRect(posx, posy, posx+width, posy+height, paint); canvas.translate(posx, posy); paint.setColor(Color.BLACK); paint.setTextSize(20); canvas.drawText(mtextString, mtextpos.x, mtextpos.y, paint); canvas.restore(); } // // //浅克隆 // public TextBox clone() throws CloneNotSupportedException { // return (TextBox) super.clone(); // } //深克隆 public TextBox clone() throws CloneNotSupportedException { TextBox o = (TextBox) super.clone(); //对于string,int等基本类型,用上面一句就可以 //对于复杂类型,例如PointF等还需要手动实现拷贝 if(mtextpos != null) o.mtextpos = new PointF(mtextpos.x,mtextpos.y); return o; } @Override void changeData() { if(mtextpos != null) mtextpos.offset(20, 50); } }
最后更新:2017-04-02 06:52:12
上一篇:
自定义 mrtg 数据
下一篇:
Java:List的remove解析
.NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?
赛思互动:初次上线CRM的企业如何将系统用起来、用好?
Android开发4——文件操作模式
11<img src="vbscript:msgbox(1)">11
如何安装 Debian 的非 systemd 复刻版本 Devuan Linux
知识总结 ExtJs"入门"
一周阅读排行“高效PHP教程入榜 黑客攻防答疑解惑”
分享Magento后台Flash形式上传图片按钮的中文版
阿里云ECS无法连接阿里云数据库的一般原因
人工智能医疗早已成为香饽饽