100行代码 CircleImageView
来源:互联网 发布:朝鲜水灾知乎 编辑:程序博客网 时间:2024/05/20 13:36
IDE预览效果
手机截屏
100行代码实现圆形ImageView
package com.example.androidtest;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.graphics.Bitmap.Config;import android.util.AttributeSet;import android.widget.ImageView;public class CircleView extends ImageView {public CircleView(Context context) {super(context);}public CircleView(Context context, AttributeSet attrs) {super(context, attrs);}public CircleView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}/** * 布局预览时会调用该方法 */@Overridepublic void setImageDrawable(Drawable drawable) {Bitmap bitmap1 = getBitmapFromDrawable(drawable);//获取到Bitmap//创建同样大小的Bitmap作为画布Bitmap bitmap2 = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(), Config.ARGB_8888);//画在bitmap2上Canvas canvas = new Canvas(bitmap2);Paint paint = new Paint();paint.setAntiAlias(true);//找到短的边作为圆的直径int r;if (bitmap2.getHeight() > bitmap2.getWidth()) {r = bitmap2.getWidth() / 2;} else {r = bitmap2.getHeight() / 2;}//在bitmap2上画圆canvas.drawCircle(bitmap2.getWidth() / 2, bitmap2.getHeight() / 2, r, paint);//设置为SRC_IN,即显示重叠部分中后画的部分。 先画的部分为DST,后画的为SRCpaint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));//把原来的bitmap1画到bitmap2上canvas.drawBitmap(bitmap1, 0, 0, paint);//上面执行完毕后bitmap2就是所要的圆形图片了super.setImageDrawable(new BitmapDrawable(bitmap2));}@Overridepublic void setImageResource(int resId) {setImageDrawable(getResources().getDrawable(resId));}/** * 获取Drawable对应的Bitmap * @param drawable * @return */private Bitmap getBitmapFromDrawable(Drawable drawable) {if (drawable == null) {return null;}if (drawable instanceof BitmapDrawable) {return ((BitmapDrawable) drawable).getBitmap();}try {Bitmap bitmap;if (drawable instanceof ColorDrawable) {bitmap = Bitmap.createBitmap(1, 1, Config.ARGB_8888);} else {bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),Config.ARGB_8888);}Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());drawable.draw(canvas);return bitmap;} catch (OutOfMemoryError e) {return null;}}}
布局
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#888" android:orientation="vertical" > <com.example.androidtest.CircleView android:id="@+id/civ" android:scaleType="centerCrop" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/pic" /> <ImageView android:layout_marginTop="10dp" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="centerCrop" android:background="#080" android:src="@drawable/pic" /> <com.example.androidtest.CircleView android:id="@+id/civ2" android:scaleType="centerCrop" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/iii" /> <ImageView android:layout_marginTop="10dp" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="centerCrop" android:background="#080" android:src="@drawable/iii" /> <com.example.androidtest.CircleView android:id="@+id/civ3" android:scaleType="centerCrop" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/pic" /> <ImageView android:layout_marginTop="10dp" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="centerCrop" android:background="#080" android:src="@drawable/pic" /> </LinearLayout></ScrollView>
调用
package com.example.androidtest;import android.os.Bundle;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PorterDuffXfermode;import android.graphics.Bitmap.Config;import android.graphics.PorterDuff.Mode;import android.view.Menu;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CircleView civ=(CircleView) findViewById(R.id.civ); Bitmap bitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.pic); civ.setImageBitmap(bitmap1); CircleView civ2=(CircleView) findViewById(R.id.civ2); civ2.setImageResource(R.drawable.iii); CircleView civ3=(CircleView) findViewById(R.id.civ3); civ3.setImageDrawable(getResources().getDrawable(R.drawable.iii));; } }
0 0
- 100行代码 CircleImageView
- 优秀代码赏析:CircleImageView
- 超简洁代码实现CircleImageView
- CircleImageView
- CircleImageView
- CircleImageView
- circleImageview
- CircleImageView
- 安卓日记——20行代码写一个CircleImageView
- CircleImageView解析
- CircleImageView分析
- Android 圆形图片 CircleImageView
- 圆形Imageview: CircleImageView
- CircleImageView框架的使用
- Android之CircleImageView
- CircleImageView源码解析
- 自定义圆形图片CircleImageView
- Android圆形头像CircleImageView
- 深度学习概述:从感知机到深度网络
- 设计模式
- java.lang.NoClassDefFoundError: android.support.v4.view.ViewConfigurationCompat
- 阿里云配置密钥SSH登录
- viterbi算法——通俗解释
- 100行代码 CircleImageView
- C语言编程函数编写一般原则
- java web 乱码总结
- 排序算法-交换排序_冒泡排序
- c语言之指针数组理解一
- hadoop完全分布式集群+Win Eclipse+Hbase+Hive+Zookeeper+Sqoop+SPARK试验机平台
- 欢迎使用CSDN-markdown编辑器
- UVA 247 Calling Circles(Floyd算法传递闭包)
- BroadcastReceiver