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