Android ShapeableImageView使用详解,告别shape、三方库

Android ShapeableImageView使用详解,告别shape、三方库,第1张

先来看一下ShapeableImageView是什么

由上图可以看到ShapeableImageView也没有什么神秘的,不过是ImageView的一个子类而已,但是从效果图来看,在不写shape、不引入三方库的情况下,还是挺容易实现预期效果的,而且扩展性良好。

关于xml属性,我也做了一个整理,属性不多,只有4个

前面为了整体的排版,埋了几个伏笔,下面来一一解答。

会涉及到源码,但是经过去繁从简,看起来也非常轻松的。

前面可以看到我们设置圆角其实是用的style,那为什么不直接用attrs呢,不是更加直观方便吗,带着疑问来看看源码是怎么处理的。

直接看ShapeableImageView的次构造方法:

常规 *** 作,获取自定义属性。

关键的两行代码:

也就是说我们给shapeAppearance设置的style,并不是ShapeableImageView自己来处理的,而是由ShapeAppearanceModel来构建的,然后又交给MaterialShapeDrawable来绘制的。

这个类就厉害了,有点像Flutter中的Decoration,可以构建出花里胡哨的效果。

来看ShapeAppearanceModel部分源码:

可以看到有各种边和角的属性,这里注意两个点:

也就意味着,边和角除了默认,是可以自定义的,这就有极大的想象空间了,比如这样:

再比如这样:

源码(有删减):

没什么特别的,你只需要知道除了可以设置描边之外,还可以设置背景、阴影等其他属性。

这里借github一张图

又是自定义view的常规 *** 作,有一半画笔是在边界外面的,所以需要设置padding为strokeWidth的一半。

有细心的同学会发现啊,第一个常规的ShapeableImageView还是有一点圆角的,没错,属于默认的,跟踪一下源码来看一下:

第一个是颜色,很明显不是我们要找的,继续看shapeAppearanceMediumComponent

只是一个简单的属性,继续查找关联引用

又引用了一个style,继续看ShapeAppearanceMaterialComponentsMediumComponent这个style

哦豁,看到了熟悉的属性cornerSize,藏的还挺深,继续看看数值是多少

默认4dp。

那如果不想要这个圆角怎么办呢,可以学习源码仿写一个,不过上面也看到了,有点绕,不如直接写个style搞定:

然后引用

效果:

ok,到这里就差不多了,虽然还有很多相关知识点没有提及,但是也不少了,不如自己去尝试一番,慢慢消化。

>

UIImageView imageView=[[UIImageView alloc] initWithFrame:CGRectMake(20, 10, Screen_width-40, 180)];

        // 将base64字符串转为NSData

        NSData decodeData = [[NSData alloc]initWithBase64EncodedString:[orderInfoDic objectForKey:@"IMAGEURL"] options:(NSDataBase64DecodingIgnoreUnknownCharacters)];

        // 将NSData转为UIImage

        UIImage decodedImage = [UIImage imageWithData: decodeData];

        imageViewuserInteractionEnabled = YES;

        [imageView setImage:decodedImage];

        UITapGestureRecognizer tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showZoomImageView:)];

        tapGesturenumberOfTapsRequired=1;

        [imageView addGestureRecognizer:tapGesture];

        [cellcontentView addSubview:imageView];

        return cell;

//放大缩小

-(void)showZoomImageView:(UITapGestureRecognizer )tap

{

    if (![(UIImageView )tapview image]) {

        return;

    }

    UIView bgView = [[UIView alloc] init];

    bgViewframe = [UIScreen mainScreen]bounds;

    bgViewbackgroundColor = [UIColor blackColor];

    [[[UIApplication sharedApplication] keyWindow] addSubview:bgView];

    UITapGestureRecognizer tapBgView = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapBgView:)];

    [bgView addGestureRecognizer:tapBgView];

    //必不可少的一步,如果直接把点击获取的imageView拿来玩的话,返回的时候,原就完蛋了

    UIImageView tempImageView = (UIImageView)tapview;

    UIImageView imageView = [[UIImageView alloc] initWithFrame:tempImageViewframe];

    imageViewimage = tempImageViewimage;

    [bgView addSubview:imageView];

    [UIView animateWithDuration:05 animations:^{

        CGRect frame = imageViewframe;

        framesizewidth = bgViewframesizewidth;

        framesizeheight = framesizewidth (imageViewimagesizeheight / imageViewimagesizewidth);

        frameoriginx = 0;

        frameoriginy = (bgViewframesizeheight - framesizeheight) 05;

        imageViewframe = frame;

    }];

}

-(void)tapBgView:(UITapGestureRecognizer )tapBgRecognizer

{

    [tapBgRecognizerview removeFromSuperview];

}

目前主流的屏幕密度:240dpi (480 800px) , 320dpi (7201280px) , 480dpi(10801920px)现在新出的手机几乎全是全高清屏(10801920px)

Android资源目录

mdpi [1倍]160dpi

hdpi [15倍]   240dpi

xhdpi [2倍]   320dpi

xxhdpi [3倍] 480dpi

xxxhdpi [4倍] 640dpi

因此对其他资源的建议是:

a一般采用720 1280的屏幕尺寸设计,这样切图可以直接适配720 1280的机型。

b720 1280下切的图基本可以适配大部分机型。

d适配480 800的机型,只需要把切图 075。

e适配1080 1920 的机型,只需要把切图 150即可。

a以720 1280作为设计标准,画布大小定位720 1280 (以后10801920px做标准亦可,类推)

b只使用偶数单位的尺寸

c尽量只使用 24pt, 28pt , 32pt, 44pt大小的字体

d设计完成之后,所有尺寸的px值除以2作为dp数据交给开发人员

e三份切图,分别是:xhdpi,hdpi,mdpi的资源,如果要切一份就使用xhdpi

栅格系统的最小单位是8dp,一切距离、尺寸都应该是8dp的整数倍,所有可 *** 作元素最小点击区域尺寸为48dp X 48dp。以下是一些常见的尺寸与距离:

有时候在自定义view,draw的时候单位往往是px,要做一个dpi的转换,需要通过该类获取屏幕的信息,如:屏幕密度,宽高等。

a尽量使用线性布局(LinearLayout)和相对布局(RelateLayout),尽量不使用绝对布局(AbsoluteLayout)和帧布局(FrameLayout)。

b尽量使用wrap_content、mach_parent让view自适应或最大化,尽量不要写宽高的值。

c使用线下布局的百分比weight权重时,要把能伸缩方向的宽度写成“0dp“,如果写成wrap_coent会使布局效果不佳等问题。

d尽量使用android的Shape自定义view背景,这样会随之自适应。

eImageView的ScaleType有几种方式:matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY;尽量使用fitCenter按比例扩大至view宽度,能取得较好适配和显示效果。(更多请参考: Android中的ImageView配适 )

f获取屏幕分辨率信息,进行动态适配。(参考第三大点)

a把屏幕设置成单一的横屏或竖屏:

b根据横竖屏加载不同布局(android: screenOrientation="sensor")

通过thisgetResources()getConfiguration()orientation来判断当前是横屏还是竖屏,然后在onCreate方法中加载不同的布局

采用第二种方式要注意的有两点

布局问题:

需要在res目录先建立layout-land和layout-port目录相应的xml文件名字相同,然后在两个文件夹下创建相同名字的两套xml,系统就会根据不同的屏幕来进行自动寻找。

切换时activity的生命周期:

activity生命周期在切换横竖屏会有一些有趣的变化

a不设置activity的android:configChanges时,切换横屏,activity的生命周期会重新调用一次,但是切换竖屏时,生命周期会重新调用两次。

b当设置activity的android:configChanges=“orientation”时,切换横竖屏都会重新调用各生命周期一次。

c当设置activity的android:configChanges=“orientation|keyboardHidden”(大于api13时,需要设为“orientation|screenSize”)时,切换横竖屏不会重新调用各生命周期,只会调用onConfigurationChanged方法。

一般设为b或者c

平板应用的特性:

对于大屏幕的平板8英寸以上(参考ipad mini,现在很多高端手机都是5-6英寸了,8英寸以上视为平板吧),基与平板应用的特性,平板应用开发一般采取如下两种策略

1)兼容模式

采用单activity(或者尽量少activity)+多fragment的结构开发应用,在layout资源文件中创建三套布局:手机布局、平板横屏布局、平板竖屏布局。

优点:

        只需要维护一个app

缺点:

        设计及实现的难度变大,更复杂,有时候需要采取折衷方案

        手机apk上由于含有平板的大分辨率资源(设计上可以减少内置资源)

2)开发另一套只适配平板的app

优点:

        与手机app分离独立。不会因为要兼容而采用一些折衷方案,影响其性能、内存

        设计和实现更加自由

缺点:

        需要维护两套app

目前谷歌推荐第一种方案,但是国内很多应用是采取第二种方案。

可以通过判断sdk的版本(BuildVERSIONSDK_INT),来为能够使用的版本进行个性化设置

例如:沉浸式状态栏配适

在Android系统44以前,状态栏的背景色和字体颜色都是不能改变的。但是44以后Google增加了改变状态栏背景透明的方法。可以通过判断sdk的版本,来为能够使用的版本进行个性化设置:

沉浸式状态栏是Android在50中引入的,在50之前是没有的,并且在Android60中沉浸式状态栏的使用方法和50不一样,因此需要做到版本兼容,针对于不同的Android进行适配,同样也是通过判断BuildVERSIONSDK_INT来区分版本,进行个性化配适

沉浸式状态栏的实现方式有好几种,更多请参考 沉浸式状态栏的实现

原则:内置资源不应该出现文字(如果出现文字需要具备)、所有的文字需要放在res资源目录特定语言目录下。

androidstudio中点击按钮后改变显示。步骤如下:

1、在布局文件中添加一个ImageView组件,用于显示。

2、在代码中获取该ImageView组件的引用,并为其设置默认的资源。

3、在代码中获取需要触发变化的按钮的引用,并为其添加一个点击事件监听器。

4、在该监听器中,使用setImageResource方法为ImageView组件设置另一张资源。

以上就是关于Android ShapeableImageView使用详解,告别shape、三方库全部的内容,包括:Android ShapeableImageView使用详解,告别shape、三方库、android ListView中有某部分要点击效果,此点击效果是用selector实现,但在ListView中点击其他部分也会有效、ios将base64字符串转为图片,点击图片全屏展示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9752272.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存