android Drawble、Shape实现图像适配和优化

一、屏幕适配说明      

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

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

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

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

    204911_mpNh_2256215.png

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

<!-drawable-scaleDrawable->
<scale android:scaleWidth="" android:scaleHeight="" android:drawable="" android:scaleGravity="" android:useIntrinsicSizeAsMinimum=""/> 
图片扭曲(缩放)显示
android:scaleWidth="" 水平扭曲度[百分比]
android:scaleHeight="" 垂直扭曲度[百分比]
android:drawable="" 原始图像
android:scaleGravity="" 缩放后的在空间中的显示方位
android:useIntrinsicSizeAsMinimum="" 是否使用原始大小作为最小宽度和高度

//level=的时候就是用户设置的的缩放后的图片,level=10000是原始图片,level=0不可见

 

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

 

<!-drawable-ClipDrawable->
<clip android:clipOrientation="" android:gravity="" android:drawable=""/>
单向图片裁剪(这个API设计的很糟糕,这个功能并不能起作用,裁剪多少无法设置,需要在代码里设置)
android:clipOrientation=""裁剪方向
android:gravity="" 裁剪起始位置
android:drawable="" 图片资源
例子:
<ImageView
    android:id="@+id/image"
    android:background="@drawable/clip"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />
 <ImageView
    android:id="@+id/image"
    android:background="@drawable/clip"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />
//下面的代码或得到clipDrawable对象,并且增加裁剪区逐步显示图片:
ImageView imageview = (ImageView) findViewById(R.id.image);
ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();
drawable.setLevel(drawable.getLevel() + 10); 

注:Level最大值为 10000,有时候可利用ClipDrawable+ImageView做进度图。

 

<!---transition-->
渐变过渡,但不能互相切换,可用于图片gellary过渡效果
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/image01"/> <!-起始图片->
    <item android:drawable="@drawable/image02"/><!-最终图片->
</transition>

 

<!--自定义形状->
<shape android:shape="">
  <solid /> 平铺色彩
  <stroke />边框
  <corners /> 圆角弯曲度(API好看不好用,只能设置同等曲度)
  <gradient/> 渐变  android:startColor="" android:centerColor="" android:endColor="" android:useLevel="" android:type="" android:gradientRadius=""
  <padding /> 图片和空间边缘的距离
</shape>
资料很多,不在解释了,

 

<!--状态切换-->
<selector android:variablePadding="" android:enterFadeDuration="" android:enterFadeDuration=""/>
android:enterFadeDuration=""  进入渐变时间
android:exitFadeDuration=""  离开渐变的时间

<selector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:enterFadeDuration="1000" 
    android:dither="true" 
    android:exitFadeDuration="1000"
    >
	<item android:state_pressed="true" >
	    <color android:color="#ff909000" />
	</item>   
	<item  >
	    <color android:color="#ff990020" />
	</item>   
</selector>
-----------------------------------------------------------------
<selector 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:enterFadeDuration="0"
    android:exitFadeDuration="300"
    android:visible="true"
    
     >
    <item  android:state_pressed="false" android:state_focused="false" android:drawable="@color/white" />
	<item android:state_pressed="true" android:drawable="@color/red"/>
	<item android:state_focused="true" android:drawable="@color/red"/>
</selector>

 

<!--ColorDrawable-->
<color android:color="" />
不解释,颜色定义

 

<!-RotateDrawable-->
<rotate android:drawable="" android:visible="" android:fromDegrees="" android:toDegrees="" android:pivotX="" android:pivotY=""/>
旋转图片
android:pivotX="" 相对x位置[float]
android:pivotY=""相对y位置[float]

也需要修正level,Level的满值是10000

 

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

 

<!--InsetDrawable-->
<inset  android:visible="" android:insetLeft="" android:insetRight="" android:insetTop="" android:insetBottom=""/>
内置背景
android:insetXXX="" 表示背景到view的外边距

 

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

<?xml version="1.0" encoding="utf-8"?>  
<clip xmlns:android="http://schemas.android.com/apk/res/android"   
    android:drawable="@drawable/fengjing"  
    android:clipOrientation="horizontal"  
    android:gravity="center">  
</clip>  

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

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

 Drawable background = new Drawable() {
            @Override
            public 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();
            }

            @Override
            public void setAlpha(int alpha) {

            }

            @Override
            public void setColorFilter(ColorFilter cf) {

            }

            @Override
            public int getOpacity() {
                return 0;
            }
        };

 

通过代码自定义Shape

public class RadiusRectShape extends RectShape {

    @Override
    public void draw(Canvas canvas, Paint paint) {
        canvas.drawRoundRect(rect(),0,0,paint);
    }
    @Override
    public 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;

	@Override
	protected 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值