Android:设置圆形头像,Android截取圆形图片
在有一些程序开发中,有时候会用到圆形,截取一张图片的一部分圆形,作为头像或者其他.
本实例就是截图圆形,设置头像的.
首先讲解一些代码
![](https://code.csdn.net/assets/CODE_ico.png)
- <ImageView android:id="@+id/screenshot_img"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="matrix"/>
图片属性要设置成android:scaleType="matrix",这样图片才可以通过触摸,放大缩小.
主类功能:点击按钮选择图片或者拍照
![](https://code.csdn.net/assets/CODE_ico.png)
- public class MainActivity extends Activity {
- private Button btnImg;
- /**
- * 表示选择的是相机--0
- */
- private final int IMAGE_CAPTURE = 0;
- /**
- * 表示选择的是相册--1
- */
- private final int IMAGE_MEDIA = 1;
- /**
- * 图片保存SD卡位置
- */
- private final static String IMG_PATH = Environment
- .getExternalStorageDirectory() + "/chillax/imgs/";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btnImg = (Button)findViewById(R.id.btn_find_img);
- btnImg.setOnClickListener(BtnClick);
- }
- OnClickListener BtnClick = new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- setImage();
- }
- };
- /**
- * 选择图片
- */
- public void setImage() {
- final AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle("选择图片");
- builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {}
- });
- builder.setPositiveButton("相机", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
- startActivityForResult(intent, IMAGE_CAPTURE);
- }
- });
- builder.setNeutralButton("相册", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
- intent.setType("image/*");
- startActivityForResult(intent, IMAGE_MEDIA);
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- }
- /**
- * 根据用户选择,返回图片资源
- */
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- ContentResolver resolver = this.getContentResolver();
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inSampleSize = 2;// 图片高宽度都为本来的二分之一,即图片大小为本来的大小的四分之一
- options.inTempStorage = new byte[5 * 1024];
- if (data != null){
- if (requestCode == IMAGE_MEDIA){
- try {
- if(data.getData() == null){
- }else{
- // 获得图片的uri
- Uri uri = data.getData();
- // 将字节数组转换为ImageView可调用的Bitmap对象
- Bitmap bitmap = BitmapFactory.decodeStream(
- resolver.openInputStream(uri), null,options);
- //图片路径
- String imgPath = IMG_PATH+"Test.png";
- //保存图片
- saveFile(bitmap, imgPath);
- Intent i = new Intent(MainActivity.this,ScreenshotImg.class);
- i.putExtra("ImgPath", imgPath);
- this.startActivity(i);
- }
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
- }else if(requestCode == IMAGE_CAPTURE) {// 相机
- if (data != null) {
- if(data.getExtras() == null){
- }else{
- // 相机返回的图片数据
- Bitmap bitmap = (Bitmap) data.getExtras().get("data");
- //图片路径
- String imgPath = IMG_PATH+"Test.png";
- //保存图片
- saveFile(bitmap, imgPath);
- Intent i = new Intent(MainActivity.this,ScreenshotImg.class);
- i.putExtra("ImgPath", imgPath);
- this.startActivity(i);
- }
- }
- }
- }
- }
- /**
- * 保存图片到app指定路径
- * @param bm头像图片资源
- * @param fileName保存名称
- */
- public static void saveFile(Bitmap bm, String filePath) {
- try {
- String Path = filePath.substring(0, filePath.lastIndexOf("/"));
- File dirFile = new File(Path);
- if (!dirFile.exists()) {
- dirFile.mkdirs();
- }
- File myCaptureFile = new File(filePath);
- BufferedOutputStream bo = null;
- bo = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
- bm.compress(Bitmap.CompressFormat.PNG, 100, bo);
- bo.flush();
- bo.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
注意:有时候要对图片进行压缩,不然在程序中很容易就造成内存溢出.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;// 图片高宽度都为本来的二分之一
options.inTempStorage = new byte[5 * 1024];
// 获得图片的uri
Uri uri = data.getData();
// 将字节数组转换为ImageView可调用的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeStream(resolver.openInputStream(uri), null,options);
图片缩放,截图类:
![](https://code.csdn.net/assets/CODE_ico.png)
- public class ScreenshotImg extends Activity {
- private LinearLayout imgSave;
- private ImageView imgView,imgScreenshot;
- private String imgPath;
- private static final int NONE = 0;
- private static final int DRAG = 1;
- private static final int ZOOM = 2;
- private int mode = NONE;
- private float oldDist;
- private Matrix matrix = new Matrix();
- private Matrix savedMatrix = new Matrix();
- private PointF start = new PointF();
- private PointF mid = new PointF();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.img_screenshot);
- imgView = (ImageView)findViewById(R.id.screenshot_img);
- imgScreenshot = (ImageView)findViewById(R.id.screenshot);
- imgSave = (LinearLayout)findViewById(R.id.img_save);
- Intent i = getIntent();
- imgPath = i.getStringExtra("ImgPath");
- Bitmap bitmap = getImgSource(imgPath);
- if(bitmap!=null){
- imgView.setImageBitmap(bitmap);
- imgView.setOnTouchListener(touch);
- imgSave.setOnClickListener(imgClick);
- }
- }
- OnClickListener imgClick = new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- imgView.setDrawingCacheEnabled(true);
- Bitmap bitmap = Bitmap.createBitmap(imgView.getDrawingCache());
- int w = imgScreenshot.getWidth();
- int h = imgScreenshot.getHeight();
- int left = imgScreenshot.getLeft();
- int right = imgScreenshot.getRight();
- int top = imgScreenshot.getTop();
- int bottom = imgScreenshot.getBottom();
- Bitmap targetBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(targetBitmap);
- Path path = new Path();
- path.addCircle((float)((right-left) / 2),((float)((bottom-top)) / 2), (float)(w / 2),
- Path.Direction.CCW);
- canvas.clipPath(path);
- canvas.drawBitmap(bitmap,new Rect(left,top,right,bottom),new Rect(left,top,right,bottom),null);
- MainActivity.saveFile(targetBitmap, imgPath);
- Toast.makeText(getBaseContext(), "保存成功", Toast.LENGTH_LONG).show();
- finish();
- }
- };
- /**
- * 触摸事件
- */
- OnTouchListener touch = new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- ImageView view = (ImageView) v;
- switch (event.getAction() & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_DOWN:
- savedMatrix.set(matrix); // 把原始 Matrix对象保存起来
- start.set(event.getX(), event.getY()); // 设置x,y坐标
- mode = DRAG;
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_POINTER_UP:
- mode = NONE;
- break;
- case MotionEvent.ACTION_POINTER_DOWN:
- oldDist = spacing(event);
- if (oldDist > 10f) {
- savedMatrix.set(matrix);
- midPoint(mid, event); // 求出手指两点的中点
- mode = ZOOM;
- }
- break;
- case MotionEvent.ACTION_MOVE:
- if (mode == DRAG) {
- matrix.set(savedMatrix);
- matrix.postTranslate(event.getX() - start.x, event.getY()
- - start.y);
- } else if (mode == ZOOM) {
- float newDist = spacing(event);
- if (newDist > 10f) {
- matrix.set(savedMatrix);
- float scale = newDist / oldDist;
- matrix.postScale(scale, scale, mid.x, mid.y);
- }
- }
- break;
- }
- System.out.println(event.getAction());
- view.setImageMatrix(matrix);
- return true;
- }
- };
- //求两点距离
- private float spacing(MotionEvent event) {
- float x = event.getX(0) - event.getX(1);
- float y = event.getY(0) - event.getY(1);
- return FloatMath.sqrt(x * x + y * y);
- }
- //求两点间中点
- private void midPoint(PointF point, MotionEvent event) {
- float x = event.getX(0) + event.getX(1);
- float y = event.getY(0) + event.getY(1);
- point.set(x / 2, y / 2);
- }
- /**
- * 從指定路徑讀取圖片資源
- */
- public Bitmap getImgSource(String pathString) {
- Bitmap bitmap = null;
- BitmapFactory.Options opts = new BitmapFactory.Options();
- // opts.inSampleSize = 2;
- try {
- File file = new File(pathString);
- if (file.exists()) {
- bitmap = BitmapFactory.decodeFile(pathString, opts);
- }
- if (bitmap == null) {
- return null;
- } else {
- return bitmap;
- }
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- }
截图关键语句:
Bitmap targetBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(targetBitmap);
Path path = new Path();
path.addCircle((float)((right-left) / 2),((float)((bottom-top)) / 2), (float)(w / 2),
Path.Direction.CCW); //绘制圆形
canvas.clipPath(path);
canvas.drawBitmap(bitmap,new Rect(left,top,right,bottom),new Rect(left,top,right,bottom),null); //截图
项目源码:http://download.csdn.net/detail/chillax_li/7120673
(有人说保存图片之后,没打开图片.这是因为我没打开它,要看效果的话,要自己用图库打开,就能看到效果了.这里说明一下)
尊重原创,转载请注明出处:http://blog.csdn.net/chillax_li/article/details/22591681
Android:设置圆形头像,Android截取圆形图片相关推荐
- android 设置动态头像,Android实现动态圆环的图片头像控件
先看效果图: 现在大部分的app上难免会使用到圆形头像,所以今天我给大家分享一个单独使用的,并且周围带有圆环动画的花哨圆形头像控件,本控件是在圆形头像控件基础上实现的,只是在其周围再画一些不同大小的圆 ...
- android人脸识显示头像自定义,Android 仿QQ头像自定义截取功能
看了Android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识. 先看看效果: 思路分析: 这个效果可以用两个View来完成,上层View是一个遮盖物,绘制 ...
- 《Android开发卷——设置圆形头像,Android截取圆形图片》
在有一些程序开发中,有时候会用到圆形,截取一张图片的一部分圆形,作为头像或者其他. 本实例就是截图圆形,设置头像的. 首先讲解一些代码 <ImageView android:id=&q ...
- android 圆形头像,自定义圆形ImageView
<!--头像--><RelativeLayoutandroid:id="@+id/ll_petInfo"android:layout_width="50 ...
- android 自定义圆形头像,android自定义圆形头像
这几天看了项目框架里面的圆形头像,发现其实这个东西并不是很难的东西,学会了原理,无论圆形头像,五角星头像都可以实现. 目前我上传的Demo里用了两种实现方式,那么我们分别来讲讲这两种实现方式: Bit ...
- 圆形头像 android,android 一个简单的实现圆形头像的Demo
[实例简介] [实例截图] [核心代码] package davidzoomimageviewrounddemo.qq986945193.com.davidzoomimageviewrounddemo ...
- android qq 圆形头像,Android仿QQ圆形头像个性名片
先看看效果图: 中间的圆形头像和光环波形讲解请看:https://www.jb51.net/article/96508.htm 周围的气泡布局,因为布局RatioLayout是继承自ViewGroup ...
- Bootstrap—实现圆角、圆形头像和响应式图片
Bootstrap提供了四种用于<img>类的样式,分别是: .img-rounded:圆角 (IE8 不支持),添加 border-radius:6px 来获得图片圆角: .img-ci ...
- Android中替换头像图标和背景图片
一,修改头像图标和名称 第一步:在res下的drawable--hdpi中导入图片 第二步:在res下的androidManifest.xml中在代码中的application的icon中修改为插入图 ...
- android 设置textview 左边,Android设置图片在TextView上、下、左、右
一种是在布局文件中的设置 android:drawablePadding="5dp"//图片与文案距离 android:drawableBottom="@drawable ...
最新文章
- mysql数据库比对视频教程_MySQL数据库全学习实战视频教程(27讲 )
- No such file or directory: jupyter-1.0.0.dist-info\\METADATA
- 决定把BLOG的文章从CU上同步过来
- 牛客题霸 [二叉树的镜像]C++题解/答案
- 最让人纠结的等式:0.999...=1
- 解决ios上微信无法捕获返回键按钮事件的问题
- [leetcode]5341. 最后 K 个数的乘积
- [USACO DEC13] 名称记录
- 网络安全基础(木马、概述、冰河木马实验)
- MySQL 定义条件与处理程序 的详细讲解
- CF891D Sloth
- 数据库第三次实验报告
- TCR-T细胞治疗最新研究进展(2021年2月)
- laydate日期时间插件实现不用点击确定
- Error: unable to perform an operation on node ‘rabbit@rabbitma‘ please see diamostics infoxmation
- Android使用SharedPreferences存储数据
- Linux ~ 系统管理。
- anaconda安装及配置
- 哈佛商学院20部必看电影
- omniplan的使用
热门文章
- ARM指令B BL BLX BX区别
- 【Metashape精品教程5】影像质量评估
- lisp全部文本改宋体字型_[推荐]修改任何文字(包括属性块、有名无名块)
- 牛车水茶渊品茗,新加坡总理与英国女王同款文化体验
- Matlab 菲涅尔系数计算
- 6个音效素材库,自媒体必备~
- 到底什么是新媒体、什么是互动、什么是互动营销?
- 人大金仓 创建表空间_Kingbase人大金仓数据库总结(SQL和JDBC)
- python爬取腾讯新闻_python爬虫实战――爬取腾讯新闻 !
- “Self-Challenging Improves Cross-Domain Generalization”阅读笔记