android圆形图片的获取与图片绕中心旋转
2015-08-04 19:30
471 查看
这是我第一篇博客,写得比较简单,望大家见谅。这篇博客主要介绍如何对图片进行处理变为图形图片,并使得图片绕中心旋转。效果图如下
首先是图形图片的获取方法,代码如下:
private Bitmap getCircularBitmap(Bitmap bitmap, int radius) {
Bitmap sbmp = Bitmap.createScaledBitmap(bitmap, radius, radius, false);
Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),
Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint paint = new Paint();
Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.BLACK);
canvas.drawCircle(sbmp.getWidth() / 2, sbmp.getHeight() / 2,
sbmp.getWidth() / 2, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(sbmp, rect, rect, paint);
return output;
}
返回的是一张圆形的图片。下面是自定义的MyView类,对获取的图片进行处理,使图片绕中心旋转。代码如下:
public class MyView extends View {
private Bitmap bitmap1;
private Bitmap bitmap2;
private int degree = 0;// 扳手图像的当前角度
static boolean flag = false;
Handler handler;
// 视图的宽高
WindowManager wm = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);
int viewWidth = wm.getDefaultDisplay().getWidth();
BitmapDrawable myImage;
public MyView(Context context) {
super(context);
setBackgroundColor(Color.WHITE);
bitmap1 = BitmapFactory.decodeResource(getResources(),
R.drawable.music_play_people);
bitmap2 = getCircularBitmap(bitmap1, 200);
myImage = new BitmapDrawable(bitmap2);
handler = new Handler();
handler.post(runnable);
}
private Runnable runnable = new Runnable() {
public void run() {
if (flag) {
postInvalidate();
}
handler.postDelayed(runnable, 50);
}
};
@Override
protected void onDraw(Canvas canvas) {
int width = bitmap2.getWidth();
int height = bitmap2.getHeight();
// 控制旋转角度在0-360之间
degree ++;
if (degree > 360)
degree = 0;
// 设置扳手图像的旋转角度和旋转轴心坐标(后两个参数,注意这个坐标是相对于屏幕的),该轴心也是图像的正中心
canvas.save();
canvas.rotate(degree, viewWidth / 3 - 45, 200);
myImage.setBounds(viewWidth / 3 - width - 45, 200 - height, viewWidth
/ 3 + width - 45, 200 + height);
myImage.draw(canvas);
canvas.restore();
}
}
在MainActivity中加载MyView对象,主activity代码如下:
public class MainActivity extends Activity {
private Button start, stop;
private RelativeLayout re;
private MyView view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
re = (RelativeLayout) findViewById(R.id.my_image);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
view = new MyView(this);
view.setLayoutParams(layoutParams);
re.addView(view);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.end);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyView.flag = true;
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyView.flag = false;
}
});
}
}
首先是图形图片的获取方法,代码如下:
private Bitmap getCircularBitmap(Bitmap bitmap, int radius) {
Bitmap sbmp = Bitmap.createScaledBitmap(bitmap, radius, radius, false);
Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),
Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint paint = new Paint();
Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.BLACK);
canvas.drawCircle(sbmp.getWidth() / 2, sbmp.getHeight() / 2,
sbmp.getWidth() / 2, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(sbmp, rect, rect, paint);
return output;
}
返回的是一张圆形的图片。下面是自定义的MyView类,对获取的图片进行处理,使图片绕中心旋转。代码如下:
public class MyView extends View {
private Bitmap bitmap1;
private Bitmap bitmap2;
private int degree = 0;// 扳手图像的当前角度
static boolean flag = false;
Handler handler;
// 视图的宽高
WindowManager wm = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);
int viewWidth = wm.getDefaultDisplay().getWidth();
BitmapDrawable myImage;
public MyView(Context context) {
super(context);
setBackgroundColor(Color.WHITE);
bitmap1 = BitmapFactory.decodeResource(getResources(),
R.drawable.music_play_people);
bitmap2 = getCircularBitmap(bitmap1, 200);
myImage = new BitmapDrawable(bitmap2);
handler = new Handler();
handler.post(runnable);
}
private Runnable runnable = new Runnable() {
public void run() {
if (flag) {
postInvalidate();
}
handler.postDelayed(runnable, 50);
}
};
@Override
protected void onDraw(Canvas canvas) {
int width = bitmap2.getWidth();
int height = bitmap2.getHeight();
// 控制旋转角度在0-360之间
degree ++;
if (degree > 360)
degree = 0;
// 设置扳手图像的旋转角度和旋转轴心坐标(后两个参数,注意这个坐标是相对于屏幕的),该轴心也是图像的正中心
canvas.save();
canvas.rotate(degree, viewWidth / 3 - 45, 200);
myImage.setBounds(viewWidth / 3 - width - 45, 200 - height, viewWidth
/ 3 + width - 45, 200 + height);
myImage.draw(canvas);
canvas.restore();
}
}
在MainActivity中加载MyView对象,主activity代码如下:
public class MainActivity extends Activity {
private Button start, stop;
private RelativeLayout re;
private MyView view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
re = (RelativeLayout) findViewById(R.id.my_image);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
view = new MyView(this);
view.setLayoutParams(layoutParams);
re.addView(view);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.end);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyView.flag = true;
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyView.flag = false;
}
});
}
}
相关文章推荐
- Android之——杀死用户选中的进程优化
- android 磨砂玻璃效果
- android "receiver not registered"
- 解决Android 5.0中出现的警告:Service Intent must be explicit
- Android.mk 文件语法规范
- Android 自定义Spinner
- Android——APK 在32bit/64bit平台 动态库问题
- IDA来Patch android的so文件
- IDA在内存中dump出android的Dex文件
- Android L metral design风格之CardView
- Ida动态修改android程序的内存数据和寄存器数值,绕过so文件的判断语句
- Ida双开定位android so文件
- Android中不同包路径下Activity跳转的实现(解决ActivityNotFoundException)
- IDA调试android so文件.init_array和JNI_OnLoad
- android 中Activity在程序运行过程中进入全屏和退出全屏
- Android之Adapter总结
- android检查版本更新实现思路
- android中sharedpreference封装思路
- android两种没接触过的api获取方法
- Android 目标平台版本应该大于或等于 10(The android-platform should be equal/large than 10)