一、屏幕适配说明
在android开发过程中,屏幕适配是一件非常重要的工作,主要原则有以下几点
- 对于控件而言,尽量不要使用固定的宽度和高度,但推荐使用固定的外边距局和内边距。
- 对于drawable-xxx而言,没必要每个dpi都放置图片,完全可以再drawable-hdpi中放入720px级别的图片就可以完成适配,
此外,如果某些部位确实需要调整的话,可以结合values-xxxx。 - 对于平滑色彩,渐变色彩,点击按压效果,层叠效果,平铺效果,尽量自定义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;
}
}
}
注意事项
在实际开发中,除了自定义的 color selector外,其余的drawable都支持ImageView,color selector只支持文字颜色变化。