热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidDrawble、Shape实现图像适配和优化

2019独角兽企业重金招聘Python工程师标准一、屏幕适配说明在android开发过程中,屏幕适配是一件非常重要的工作,主要原则有以下几点对于控

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、屏幕适配说明      

在android开发过程中,屏幕适配是一件非常重要的工作,主要原则有以下几点

  1. 对于控件而言,尽量不要使用固定的宽度和高度,但推荐使用固定的外边距局和内边距。

  2. 对于drawable-xxx而言,没必要每个dpi都放置图片,完全可以再drawable-hdpi中放入720px级别的图片就可以完成适配,

    此外,如果某些部位确实需要调整的话,可以结合values-xxxx。

    204911_mpNh_2256215.png

  3. 对于平滑色彩,渐变色彩,点击按压效果,层叠效果,平铺效果,尽量自定义drawable,color,bitmap,layer。


 
图片扭曲(缩放)显示
android:scaleWidth="" 水平扭曲度[百分比]
android:scaleHeight="" 垂直扭曲度[百分比]
android:drawable="" 原始图像
android:scaleGravity="" 缩放后的在空间中的显示方位
android:useIntrinsicSizeAsMinimum="" 是否使用原始大小作为最小宽度和高度//level=的时候就是用户设置的的缩放后的图片,level=10000是原始图片,level=0不可见

 



android:src="" 原始图片
android:antialias="" 是否消除锯齿
android:dither="" 像素不足时是否进行弥合(适用于低像素的图片)
android:gravity="" 图片显示方位
android:tileMode="" 拉伸模式  mirror(镜像),clamp(投影),repeat(重复),disabled(拉伸)

 



单向图片裁剪(这个API设计的很糟糕,这个功能并不能起作用,裁剪多少无法设置,需要在代码里设置)
android:clipOrientation=""裁剪方向
android:gravity="" 裁剪起始位置
android:drawable="" 图片资源
例子:

//下面的代码或得到clipDrawable对象,并且增加裁剪区逐步显示图片:
ImageView imageview = (ImageView) findViewById(R.id.image);
ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();
drawable.setLevel(drawable.getLevel() + 10); 注:Level最大值为 10000,有时候可利用ClipDrawable+ImageView做进度图。

 


渐变过渡,但不能互相切换,可用于图片gellary过渡效果

 

 



android:enterFadeDuration=""  进入渐变时间
android:exitFadeDuration=""  离开渐变的时间      

-----------------------------------------------------------------

 



不解释,颜色定义

 



旋转图片
android:pivotX="" 相对x位置[float]
android:pivotY=""相对y位置[float]也需要修正level,Level的满值是10000

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

...

叠层图片,可以将多种drawable或者图片资源按照层次,从下倒上依次叠加,可视为合成图片,在android开发中,对ratibar,progressbar,slideBar样式修改
android:opacity="" 透明度,opaque->translucent->transparent

 



内置背景
android:insetXXX="" 表示背景到view的外边距

 

4. 对于部分帧动画,完全可以使用自定义clipDrable的方式进行替代。



二、通过代码形式自定义Drawable

5.有时也可以选择直接绘drawable,可扩展性更强

 Drawable background = new Drawable() {@Overridepublic void draw(Canvas canvas){//canvas.drawLine(viewWidth * 1 / 10, obtainSelectedAreaBorder()[0], viewWidth * 9 / 10, obtainSelectedAreaBorder()[0], paint);//canvas.drawLine(viewWidth * 1 / 10, obtainSelectedAreaBorder()[1], viewWidth * 9 / 10, obtainSelectedAreaBorder()[1], paint);RectF rect = new RectF();rect.left = 16;rect.top  = obtainSelectedAreaBorder()[0]-5;rect.right = viewWidth-16;rect.bottom = obtainSelectedAreaBorder()[1]-5;canvas.save();paint.setColor(0x88919191);paint.setStrokeWidth(1.1f);paint.setStyle(Style.STROKE);paint.setAntiAlias(false);canvas.drawRoundRect(rect, 5, 5, paint);canvas.restore();}@Overridepublic void setAlpha(int alpha) {}@Overridepublic void setColorFilter(ColorFilter cf) {}@Overridepublic int getOpacity() {return 0;}};

 

通过代码自定义Shape

public class RadiusRectShape extends RectShape {@Overridepublic void draw(Canvas canvas, Paint paint) {canvas.drawRoundRect(rect(),0,0,paint);}@Overridepublic RectShape clone() throws CloneNotSupportedException {final RadiusRectShape shape = (RadiusRectShape) super.clone();return shape;}public ShapeDrawable createShapeDrawable(){ShapeDrawable sd = new ShapeDrawable(this);return sd;}
}

6.点9图的使用

点九图是一种非常理想的选择,注意,点九图的左变黑色区域和上边黑色区域为拉伸或者压缩区域,右边黑色区域和下边黑色区域为内容显示基准(可以省略),在没省略的情况下超过区域的文字显示不全。

 

7.关于动画,有些drawable和animation有类似的功能,有时需要2者配合

package test.view.weitop;public class AnimActivity extends BaseActivity {private View vline;private int width = 0;@Overrideprotected void onCreate(Bundle saveInstance) {super.onCreate(saveInstance);setContentView(R.layout.anim_layout);int w = getWindow().getWindowManager().getDefaultDisplay().getWidth();vline = findViewById(R.id.line);LayoutParams lp = vline.getLayoutParams();width = lp.width = w / 2+ getResources().getDimensionPixelSize(R.dimen.common_1dip) / 2;vline.setLayoutParams(lp);vline.setTag("0");}public void doSwicth(View v) {switch (v.getId()) {case R.id.fade_anim_left: {if (!"0".equals(vline.getTag().toString())) {vline.setTag("0");TranslateAnimation ta = new TranslateAnimation(width, 0, 1, 1);ta.setDuration(200);ta.setFillBefore(true);vline.clearAnimation();vline.startAnimation(ta);}}break;case R.id.fade_anim_right:if (!"1".equals(vline.getTag().toString())) {vline.setTag("1");TranslateAnimation ta = new TranslateAnimation(0, width, 1, 1);ta.setDuration(200);ta.setFillBefore(true);ta.setFillAfter(true);vline.clearAnimation();vline.startAnimation(ta);}break;default:break;}}}

 

070036_oq4L_2256215.jpg    070036_czrz_2256215.jpg

参考网站

http://blog.csdn.net/superjunjin/article/details/7670864

http://blog.csdn.net/ronghao3508/article/details/19118429

http://blog.csdn.net/lonelyroamer/article/details/8242919  

http://www.iteye.com/topic/689272

http://blog.csdn.net/a_large_swan/article/details/7107126

http://mux.baidu.com/?p=1506

 

注意事项

在实际开发中,除了自定义的 color selector外,其余的drawable都支持ImageView,color selector只支持文字颜色变化。

 

 

 


转:https://my.oschina.net/ososchina/blog/346562



推荐阅读
author-avatar
陨落星辰W_955
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有