android Bitmap围绕一个点进行旋转
2013-07-22 16:35
351 查看
转自:http://www.cdtarena.com/gpx/201307/9312.html
在项目中需要使用定位功能,也就是一个点围绕一个圆心进行旋转,查看了canvas的函数也就只有一个 canvas.drawBitmap(bitmap, matrix, paint)通过使用Matrix来实现旋转,这里实现一个demo,功能就是小原点顺时针绘制一个原然后逆时针撤销这个圆,通过Timer来实现。代码如下:Surface.java这个是实现绘制图形的类[java] view plaincopyprint?package com.example.test;
import java.util.Timer;
import java.util.TimerTask;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
@SuppressLint("HandlerLeak")
class Surface extends SurfaceView implements Callback{
Bitmap bmp;
private Paint mPaint;
private SurfaceHolder mHolder;
public Surface(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mPaint = new Paint();
mPaint.setColor(Color.GREEN);
mPaint.setAntiAlias(true);//抗锯齿
setFocusable(true);
setFocusableInTouchMode(true);
// setZOrderOnTop(true);
// mHolder.setFormat(PixelFormat.TRANSPARENT);//设置背景透明
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_r_local);
bmp = Bitmap.createScaledBitmap(bmp, 15, 15, false);
}
public Handler handler = new Handler(){
@Override
publicvoid handleMessage(Message msg) {
switch (msg.what) {
case0:
canvas_ok();
break;
}
super.handleMessage(msg);
}
};
publicvoid canvas_ok(){
Canvas canvas = null;
try {
canvas = mHolder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);//清除屏幕
// canvas.save();
Matrix matrix = new Matrix();
matrix.postTranslate(130, 0);
matrix.postRotate(degree, 130 ,130);
canvas.drawBitmap(bmp, matrix, mPaint);
// canvas.restore();
} catch (Exception e) {
}finally {
if(canvas != null) {
mHolder.unlockCanvasAndPost(canvas);
}
}
}
int degree = 0;
Timer timer = new Timer();
boolean flag = true;
@Override
publicvoid surfaceCreated(SurfaceHolder holder) {
canvas_ok();
timer.schedule(new TimerTask() {
@Override
publicvoid run() {
if (flag) {
degree++;
if (degree == 360) {
flag = false;
}
}else {
degree--;
if(degree == -360 || degree == 0){
flag = true;
}
}
Log.e("flag", degree+" : "+flag);
handler.sendEmptyMessage(0);
}
}, 50, 50);
}
http://www.cdtarena.com/ruanj.html
@Override
publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
publicvoid surfaceDestroyed(SurfaceHolder holder) {
if (timer != null) {
timer.cancel();
timer = null;
}
}
}
Main7.java是主类[java] view plaincopyprint?package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;
publicclass Main7 extends Activity{
Surface surface;
RelativeLayout.LayoutParams laParams;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
surface = new Surface(this);
laParams = new RelativeLayout.LayoutParams(260, 260);
setContentView(surface, laParams);
}
}
效果图如下:
在项目中需要使用定位功能,也就是一个点围绕一个圆心进行旋转,查看了canvas的函数也就只有一个 canvas.drawBitmap(bitmap, matrix, paint)通过使用Matrix来实现旋转,这里实现一个demo,功能就是小原点顺时针绘制一个原然后逆时针撤销这个圆,通过Timer来实现。代码如下:Surface.java这个是实现绘制图形的类[java] view plaincopyprint?package com.example.test;
import java.util.Timer;
import java.util.TimerTask;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
@SuppressLint("HandlerLeak")
class Surface extends SurfaceView implements Callback{
Bitmap bmp;
private Paint mPaint;
private SurfaceHolder mHolder;
public Surface(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mPaint = new Paint();
mPaint.setColor(Color.GREEN);
mPaint.setAntiAlias(true);//抗锯齿
setFocusable(true);
setFocusableInTouchMode(true);
// setZOrderOnTop(true);
// mHolder.setFormat(PixelFormat.TRANSPARENT);//设置背景透明
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_r_local);
bmp = Bitmap.createScaledBitmap(bmp, 15, 15, false);
}
public Handler handler = new Handler(){
@Override
publicvoid handleMessage(Message msg) {
switch (msg.what) {
case0:
canvas_ok();
break;
}
super.handleMessage(msg);
}
};
publicvoid canvas_ok(){
Canvas canvas = null;
try {
canvas = mHolder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);//清除屏幕
// canvas.save();
Matrix matrix = new Matrix();
matrix.postTranslate(130, 0);
matrix.postRotate(degree, 130 ,130);
canvas.drawBitmap(bmp, matrix, mPaint);
// canvas.restore();
} catch (Exception e) {
}finally {
if(canvas != null) {
mHolder.unlockCanvasAndPost(canvas);
}
}
}
int degree = 0;
Timer timer = new Timer();
boolean flag = true;
@Override
publicvoid surfaceCreated(SurfaceHolder holder) {
canvas_ok();
timer.schedule(new TimerTask() {
@Override
publicvoid run() {
if (flag) {
degree++;
if (degree == 360) {
flag = false;
}
}else {
degree--;
if(degree == -360 || degree == 0){
flag = true;
}
}
Log.e("flag", degree+" : "+flag);
handler.sendEmptyMessage(0);
}
}, 50, 50);
}
http://www.cdtarena.com/ruanj.html
@Override
publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
publicvoid surfaceDestroyed(SurfaceHolder holder) {
if (timer != null) {
timer.cancel();
timer = null;
}
}
}
Main7.java是主类[java] view plaincopyprint?package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;
publicclass Main7 extends Activity{
Surface surface;
RelativeLayout.LayoutParams laParams;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
surface = new Surface(this);
laParams = new RelativeLayout.LayoutParams(260, 260);
setContentView(surface, laParams);
}
}
效果图如下:
相关文章推荐
- android Bitmap围绕一个点进行旋转
- android Bitmap围绕一个点进行旋转
- android Bitmap围绕一个点进行旋转
- Android Cocos2d旋转动画 图片围绕一个圆心做圆运动
- android Bitmap围绕一个点进行旋转
- Android中传入一个角度一张图片 返回旋转后的Bitmap.
- android 玩转ContentProvider之三--实现一个ContentProvider对多张表进行操作
- Android 对布局进行任意角度旋转
- 在android与debian上用opengles2绘制一个3D的旋转地球
- android 将图片内容解析成字节数组,将字节数组转换为ImageView可调用的Bitmap对象,图片缩放,把字节数组保存为一个文件,把Bitmap转Byte
- Unity3D 中 用quaternion 来对一个坐标点进行旋转的初步体会
- (转)android 围绕中心旋转动画
- android中bitmap的旋转
- Android Bitmap图片缩放优化,用canvas替代Matrix进行缩放,解决一些错我
- android Bitmap如何保存成为一个bmp文件
- android 使用 websocket 进行长链接的一个简单的 demo,可以用来收发消息或别的操作,里面用到了 autobahn 的 jar 包
- android Bitmap如何保存成为一个bmp 文件
- Android核心基础——S02E05_使用另外一个工程进行单元测试
- android对一个ordered broadcast进行拦载的方法
- unity3d中用四元数 Quaternion来对一个坐标点进行旋转的初步体会