Android 2D图像显示(转)

原文地址:http://blog.csdn.net/Veini/archive/2009/09/10/4537365.aspx
本文介绍在Android如何显示2D图像

1)使用XML,代码如下

view plaincopy to clipboardprint?
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/android"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/android"
/>

(代码比较简单,不做解析了!!)

2)继承View

根据public void setContentView (View view) ,新建一个继承View的类,并重写onDraw函数。代码如下:

view plaincopy to clipboardprint?
package android.szu.edu.cn;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.Window;

public class Show2DImage extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//setContentView(R.layout.main);
setContentView(new Panel(this));
}

class Panel extends View{

public Panel(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public void onDraw(Canvas canvas){
Bitmap _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(_scratch, 10, 10, null);
}
}
}
package android.szu.edu.cn;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.Window;

public class Show2DImage extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//setContentView(R.layout.main);
setContentView(new Panel(this));
}

class Panel extends View{

public Panel(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public void onDraw(Canvas canvas){
Bitmap _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(_scratch, 10, 10, null);
}
}
}

3)利用SurfaceView和Thread

view plaincopy to clipboardprint?
package android.szu.edu.cn;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;

public class Show2DImage extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// setContentView(R.layout.main);
setContentView(new Panel(this));
}

// class Panel extends View{
//
// public Panel(Context context) {
// super(context);
// // TODO Auto-generated constructor stub
// }
//
// public void onDraw(Canvas canvas){
// Bitmap _scratch = BitmapFactory.decodeResource(getResources(),
// R.drawable.icon);
// canvas.drawColor(Color.BLACK);
// canvas.drawBitmap(_scratch, 10, 10, null);
// }
// }

class Panel extends SurfaceView implements SurfaceHolder.Callback {

private Draw2DThread _thread;

public Panel(Context context) {
super(context);
getHolder().addCallback(this);
_thread = new Draw2DThread(getHolder(), this);
}

public void onDraw(Canvas canvas) {
Bitmap _scratch = BitmapFactory.decodeResource(getResources(),
R.drawable.android);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(_scratch, 10, 10, null);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
_thread.setRunning(true);
_thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
boolean retry = true;
_thread.setRunning(false);
while (retry) {
try {
_thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO: handle exception
}
}
}

}

class Draw2DThread extends Thread {
private SurfaceHolder _surfaceHolder;
private Panel _panel;
private boolean _run;

public Draw2DThread(SurfaceHolder surfaceHolder, Panel panel) {
_surfaceHolder = surfaceHolder;
_panel = panel;
}

public void setRunning(boolean run) {
_run = run;
}

public void run() {
Canvas c;
while (_run) {
c = null;
try {
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
_panel.onDraw(c);
}
} finally {
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}

}
}
}
package android.szu.edu.cn;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;

public class Show2DImage extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// setContentView(R.layout.main);
setContentView(new Panel(this));
}

// class Panel extends View{
//
// public Panel(Context context) {
// super(context);
// // TODO Auto-generated constructor stub
// }
//
// public void onDraw(Canvas canvas){
// Bitmap _scratch = BitmapFactory.decodeResource(getResources(),
// R.drawable.icon);
// canvas.drawColor(Color.BLACK);
// canvas.drawBitmap(_scratch, 10, 10, null);
// }
// }

class Panel extends SurfaceView implements SurfaceHolder.Callback {

private Draw2DThread _thread;

public Panel(Context context) {
super(context);
getHolder().addCallback(this);
_thread = new Draw2DThread(getHolder(), this);
}

public void onDraw(Canvas canvas) {
Bitmap _scratch = BitmapFactory.decodeResource(getResources(),
R.drawable.android);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(_scratch, 10, 10, null);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
_thread.setRunning(true);
_thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
boolean retry = true;
_thread.setRunning(false);
while (retry) {
try {
_thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO: handle exception
}
}
}

}

class Draw2DThread extends Thread {
private SurfaceHolder _surfaceHolder;
private Panel _panel;
private boolean _run;

public Draw2DThread(SurfaceHolder surfaceHolder, Panel panel) {
_surfaceHolder = surfaceHolder;
_panel = panel;
}

public void setRunning(boolean run) {
_run = run;
}

public void run() {
Canvas c;
while (_run) {
c = null;
try {
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
_panel.onDraw(c);
}
} finally {
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}

}
}
}

第三种方法,可以快速地描绘界面,使用SurfaceView可以让其它非UI线程直接对画面进行操作。

更多相关文章

  1. Android(安卓)OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程
  2. Android的startActivity启动出错
  3. Android(安卓)8.0 Volte开关流程 HD图标显示
  4. 【Android】Android(安卓)Input
  5. android intent.setDate方法
  6. Android判断当前App是在前台还是在后台
  7. repo 切换分支一种简单的方法
  8. Android(安卓)重写ViewGroup 分析onMeasure()和onLayout()方法
  9. android 在java代码中动态设置控件的位置和设置片大小

随机推荐

  1. Android中Context的理解与使用技巧
  2. 一个常见的android内存泄露 问题
  3. android点击EditText外区域收起键盘
  4. Error:more than one library with packa
  5. Android——SeekBar(进度、音量大小的控件
  6. Android中保存图片到本地并更新到相册及
  7. Android(安卓)SystemUI 闪烁
  8. Android中应用的快捷方式的创建
  9. android使用HttpURLConnection上传文件同
  10. Android中四大组件概述以及各自作用