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無法連接阿裏雲數據庫的一般原因
人工智能醫療早已成為香餑餑