andorid最新的不规则色彩背景图片自适应屏幕宽高,背景不变形

来源:互联网 发布:出差携带知乎 编辑:程序博客网 时间:2024/05/21 11:06

先在这里吐槽一下万恶的客户改需求...

再说一句...网上大部份资料都是坑爹的.因为不是针对你需求来写的....别照抄..你只能从多种答案中总结出自己的代码.自己的方法

所谓不规则背景图片是指色彩不同统.不是图形不规则. ----如户外照片


在安卓中.为了尽量避免布局问题.我们一般都是尽量使用统一色调或有一定变色规律的图片作为背景.因为这样易处理. 用.9图

但遇到一般变态的需求..那就实在没办法了.下面进入主题


一般要做自适应的背景. 尽量做单色或有规则的图.这样可以用.9图来无限拉伸,还不变形.

什么是.9图..做安卓的一定要用.请百度draw9patch的用法


安卓有各种不同屏幕不同像素不同密度的手机.如果一个应用面向广,那必定要做到各种机型匹配.

这里对什么像素什么密度这个坑爹的东西就不说了.说了我也懂,你也不懂.


要做到绝大部份机型屏幕匹配.有三步必不可少

第一, 做多套图,不是所有的activity都做多套图.主要是针对哪个activity加载过那些坑爹的不规则图的来做

hdpi(480*800)--ldpi(320*480)--mdpi(240*320)--xhdpi(720*1280)四个文件夹各一套(文件命名相同)...别想偷懒了.项目经理会叼死你的

第二 针对多套图,做多套布局

图片问题解决了,接下来到布局.别以为解决图片就完事了. 因为如果你布局中有写死的高或宽度..屏幕(分辩率)的大小也会影响到布局的...

针对各套图对一个布局(文件命名相同)放在不同的文件夹中. 文件夹的命名有点要注意.在res下新建一个名为layout-800x480的文件夹放针对hdpi图的.依以类推..就得800在前面.要不报错...

第三用bitmap.createBitmap()方法对图片进行切割.以便适应应用程序的宽高(不是屏幕的宽高喔..如果不是满屏的,还有那该死的通知栏高度要减去的)

当你欢天喜地地做完第一第二步就去设背景图时.若你细心.如果你直接用480*800的图作背景时..TMD还是会被压扁了..为什么.网上的人都说直接切480的高就可以自动适应的.为什么..我告诉你. 网上的大部份都是坑爹的答案..要么是copy.要么是装大神不实践单看API就回答你的.

480*800是的800是啥.屏幕高度..你应用是全屏显示的么.不是吧. 那就得在这个800上减去通知栏的高度啊..这个才是你应用程序的高度.

可能你会说. 那我直接叫美工切图时不切够800就行啦.减去通知栏高度切..你肯定所有手机的通知栏高度是一样的么?平板呢?非主流改通知栏高度呢? 坑死你...我就是这样被坑死的.

那么我们就要在代码中动态获取通知栏高度.减去..从面得到真正的应用程序高度A..这里暂时叫A.假设它是750高的.

你的图是800..实度背景高是750.那你的图肯定被压扁啦..怎么办呢.到这里.我只想到了一个折中的办法.

就是把 屏幕不能显示的那一部份图切割掉(我切的是图片底部)...这个是没办法的办法..将损失减到最少.

宽度让它去自适用..多出来的高度切换. 同理.如果是宽度多出来的话.就把宽度切掉,

因为Bitmap.createBitmap方法是把一个位图.从什么位置开始切到什么位置的. 这里你可以根据需要去慢慢灵活运用.

下面贴出它的代码.

至于还有一些坑爹的768*1280的这些屏幕. 同样可以用切割去处理..

下面代码中.XML代码就是一相对布局.里面没有任何东西.相对布局的宽度是父窗口自适应

public class MainActivity extends Activity {RelativeLayout a;@SuppressLint("NewApi")@Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        a = (RelativeLayout)findViewById(R.id.a);        //通知栏高度        int i = getStatusBarHeight(this);        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.main_bg);        DisplayMetrics metric = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(metric);        int width = metric.widthPixels;     // 屏幕宽度(像素)        int height = metric.heightPixels;   // 屏幕高度(像素)        System.out.println(height);        Bitmap bm1 = bm.createBitmap(bm, 0, 0, width, height-i);        Drawable bd = new BitmapDrawable(getResources(), bm1);        a.setBackground(bd);    }    //获取通知栏高度    public static int getStatusBarHeight(Context context){        Class<?> c = null;        Object obj = null;        Field field = null;        int x = 0, statusBarHeight = 0;        try {            c = Class.forName("com.android.internal.R$dimen");            obj = c.newInstance();            field = c.getField("status_bar_height");            x = Integer.parseInt(field.get(obj).toString());            statusBarHeight = context.getResources().getDimensionPixelSize(x);        } catch (Exception e1) {            e1.printStackTrace();        }        return statusBarHeight;    }    }




0 1
原创粉丝点击