IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android:一套默认头像的封装 -> 正文阅读

[移动开发]android:一套默认头像的封装

写这个是在项目迭代的时候遇到的,一开始都是圆形的头像,今天突然说~要把所有的头像改成圆角矩形....

我一开始没注意到这个,就把所有有关头像调用的部分整合了一下

如图~

那就不多bb了。直接上代码

这是一个形状的分类?

public class HeaderShap {

    /*
    * 圆形,上下文,文本组件,图片链接
    * */
    public void ShapCircle(Context context, TextView tv_default, ImageView iv_avatar, String avatar) {
        RequestOptions options = RequestOptions.bitmapTransform(new CropCircleTransformation());
        glide(context,tv_default,iv_avatar,avatar,options);
    }
    /*
     * 圆角矩形,上下文,文本组件,图片链接
     * */
    public void ShapRounded(Context context, TextView tv_default, ImageView iv_avatar, String avatar) {
        //RequestOptions options =  RequestOptions.bitmapTransform(new RoundedCorners(20));

        //第一个是上下文,第二个是圆角的弧度
        RequestOptions options = new RequestOptions()
                .transform(new GlideRoundTransform(context,20));

        glide(context,tv_default,iv_avatar,avatar,options);
    }

    //共同部分的代码封装一下
    private void glide(Context context, TextView tv_default, ImageView iv_avatar, String avatar,RequestOptions options){

        Glide.with(context)
                .load(avatar)
                //.placeholder(R.drawable.ic_default_image)
                .error(R.drawable.default_avatar_background)
                .apply(options)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        tv_default.setVisibility(View.VISIBLE);
                        return false;
                    }
                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource
                            dataSource, boolean isFirstResource) {
                        tv_default.setVisibility(View.INVISIBLE);
                        return false;
                    }
                })
                .into(iv_avatar);
    }

    /*
     * 标准矩形,上下文,文本组件,图片链接
     * */
    public void ShapRectangle(Context context, TextView tv_default, ImageView iv_avatar, String avatar) {
        RequestOptions options = RequestOptions.bitmapTransform(new RoundedCorners(0));
        glide(context, tv_default, iv_avatar, avatar, options);
    }
}

继承glide自定义的样式,不用这个设置矩形的话,会被缩放,显示的不是矩形,会显示成圆角的缩放图,如果原图是长方形,那就是长方行圆角~这么讲能理解吧


public class GlideRoundTransform extends BitmapTransformation {
 
    private static float radius = 0f;
 
    public GlideRoundTransform(Context context) {
        this(context, 4);
    }
 
    public GlideRoundTransform(Context context, int dp) {
        super();
        this.radius = dp;
        //this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
    }
 
    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        Bitmap bitmap = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight);
        return roundCrop(pool, bitmap);
    }
 
    private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;
 
        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        }
 
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
        canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
    }
 
    public String getId() {
        return getClass().getName() + Math.round(radius);
    }
 
    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) {
 
    }
 
}

?默认的圆角图,颜色自己改一下,我是根据主题色来的

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape
            android:shape="rectangle">
            <solid android:color="@color/color_theme"/>
            <corners android:radius="10dp"/>
            <stroke
                android:width="0.5dp"
                android:color="@color/color_theme"/>
        </shape>
    </item>
    </layer-list>

最后就是调用了

第一个参数是上下文,第二个是默认会显示的昵称,第三个是显示图片的控件,第四个是图片地址(如果没有,显示的就是默认的)

HeaderShap shap = new HeaderShap();
shap.ShapRounded(context,tv_udefault_avatar,iv_avatar,avatar);

最后头像的xml也发一下吧,这个其实很简单,imagview显示的是默认,昵称和将要显示的图片都暂时隐藏,没有图片地址的时候,昵称会显示,就和钉钉那种差不多,这篇文章,上半年我是写过,只是没封装,简单使用,各位可以向上翻看一下~

    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ll_avatar"
    android:background="#00000000"
        android:layout_width="40dp"
        android:layout_height="40dp">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="40dp"
        android:layout_height="40dp">
    <TextView
        android:id="@+id/user_id"
        android:layout_width="0dp"
        android:layout_height="0dp"
        tools:ignore="Suspicious0dp" />
        <ImageView
            android:padding="4dp"
            android:id="@+id/iv_avatar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/default_avatar_background"
            />
        <TextView
            android:visibility="invisible"
            android:id="@+id/tv_default_avatar"
            android:text="京怀"
            android:textColor="@color/white"
            android:textSize="11dp"
            android:gravity="center"
            android:layout_marginTop="-40dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
</LinearLayout>

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-23 12:28:54  更:2021-11-23 12:29:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:35:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码