
先来看一下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字符串转为图片,点击图片全屏展示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)