Android Launcher 应用图标大小不一的情况或GirdView Item 不规则处理与解决

原创 2015年11月19日 12:05:54

前段时间我的好朋友他离职了,所以他余留下来的工作就暂时交接给了我,也就是一些客户的UI定制,通俗的说就是 Launcher 手机主界面,这个不是通过原生 Launcher 修改的

全都是自己写的,不需要原生的源码,其实 Launcher 实质也是一个 app 只是添加了 如下两条权限就可以实现


<span style="font-size:14px;color:#3366ff;"><strong> <category android:name="android.intent.category.HOME" />
 <category android:name="android.intent.category.DEFAULT" /></strong></span>

普通的 Launcher 只是做一些界面效果、点击事件、划屏事件,复杂一点的会做一些动画引擎、替换壁纸、设置屏幕保护效果、AIDL 控制 FM 的Hz、音乐操作等等、一般写一个普

通的 Launcher 只需要一会儿,打个比方,一天工作日 7.5H,我可以写6-8个这样的 Launcher 前提是美工切好了现成的素材,那么 关于Launcher的简单介绍就到这里,开始我们

今天这篇博客所要讲的东西


在适配公司智能后视镜屏的时候,需要适配 1200*360 、710*440 、800*392 、800*480 、480*272 这几个屏,即公司售卖的几款主流机型,Launcher 运行在 1200*360 、

710*440 、800*392 、这三个分辨率的屏幕下还是正常的,但是运行在 800*480 、480*272 这两个屏幕上就不正常了,应用图标显示大小不一,然而今天同事又遇到了这样的问

题,跑来问我,因为之前解决过类似的问题,所以应该不算问题,就几秒钟搞定,下面我给大家看看 bug 效果图(因为480*227的没有截图,我就以800*480为案例来分析):


Bug 效果图:





可以很明显的看出红色方框里的应用图标与正常图标相差很大,正常图标看起来要比红色框里的图标大很多,造成的原因就是分辨率跟机型冲突或者是应用里只写了一套分辨率

的UI,这个时候我们就需要在代码里处理这样的情况了,很具分辨率来处理并且显示处理效果,图中的浅绿色网格式是 PS 网格线,用来区分应用图标对比的效果更突显,我仔

细观察了一下,发现小图标都是我们公版的系统级app,这时候我就想到了包名的命名,然后写了一个抓包工具,把包名前缀提取了出来,当然具体过滤条件可以自己细化,我

这里只不过举个例子来说明,下面看看具体的处理方式


<span style="font-size:14px;color:#3366ff;"><strong>    private boolean isSystemApp(String packageName) {
    	boolean isSystemApp = false;
    	if(packageName.startsWith("com.pg.software")){
    		isSystemApp = true;
    	}else{
    		isSystemApp = false;
    	}
		return isSystemApp;
	}</strong></span>

这是区分系统app命名的函数,根据条件返回 boolean 值


<span style="font-size:14px;color:#3366ff;"><strong>        if (isSystemApp(allApps.get(position).getPackageName())) {// system
			width = 120; height = 120;
			LayoutParams params = new LayoutParams(width, height);
			params.addRule(RelativeLayout.CENTER_IN_PARENT);
			viewHolder.appIcon.setLayoutParams(params);
			
		} else {
			width = 100; height = 100;
			LayoutParams params = new LayoutParams(width, height);
			params.addRule(RelativeLayout.CENTER_IN_PARENT);
			viewHolder.appIcon.setLayoutParams(params); 
		}</strong></span>

这里是调用上面的区分方法做一个细化区分处理,以至于应用图标显示统一


布局文件Item:

<span style="font-size:14px;color:#3366ff;"><strong><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

  <RelativeLayout
        android:layout_width="120dp"
        android:layout_height="120dp" 
        >

        <ImageView
            android:id="@+id/grid_item_img"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerInParent="true"
            android:scaleType="fitCenter" />
    
  </RelativeLayout>
    <TextView
        android:id="@+id/grid_item_txt"
        android:layout_marginTop="2dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textColor="@android:color/white"
        android:textSize="18sp" />

</LinearLayout></strong></span>

下面看看处理之后的效果:





为了避免大家稀里糊涂,我把整个适配器的代码都贴出来吧:


<span style="font-size:14px;color:#3366ff;"><strong>package com.daxun.launcher.adapter;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import com.example.launcher.jd.R;

public class GridViewAdapter extends BaseAdapter {
    private ArrayList<AppInfo> allApps;
    private LayoutInflater mInflater;
	private int height;
	private int width;

    public GridViewAdapter(Context context, ArrayList<AppInfo> allApps) {
        this.allApps = allApps;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return allApps.size();
    }

    @Override
    public Object getItem(int position) {
        return allApps.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    public void setDataChange(ArrayList<AppInfo> allApps){
        this.allApps=allApps;
        notifyDataSetChanged();
    }
    @Override
    public View getView(int position, View convertView, ViewGroup arg2) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.gridview_item, null);
            viewHolder.appIcon = (ImageView) convertView
                    .findViewById(R.id.grid_item_img);
            viewHolder.appName = (TextView) convertView
                    .findViewById(R.id.grid_item_txt);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        
        if (isSystemApp(allApps.get(position).getPackageName())) {// system
			width = 120; height = 120;
			LayoutParams params = new LayoutParams(width, height);
			params.addRule(RelativeLayout.CENTER_IN_PARENT);
			viewHolder.appIcon.setLayoutParams(params);
			
		} else {
			width = 100; height = 100;
			LayoutParams params = new LayoutParams(width, height);
			params.addRule(RelativeLayout.CENTER_IN_PARENT);
			viewHolder.appIcon.setLayoutParams(params); 
		}
        
        viewHolder.appIcon.setImageDrawable(allApps.get(position).getIcon());
        viewHolder.appName.setText(allApps.get(position).getAppName());
        return convertView;
    }

    private boolean isSystemApp(String packageName) {
    	boolean isSystemApp = false;
    	if(packageName.startsWith("com.pg.software")){
    		isSystemApp = true;
    	}else{
    		isSystemApp = false;
    	}
		return isSystemApp;
	}

	class ViewHolder {
        ImageView appIcon;
        TextView appName;
    }
}
</strong></span>

简单而又粗暴的解决方式,遇到类似的情况可以参考此类解决方法,谢谢观博!
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android系统布局——自带的布局android.R.layout详解

布局文件,作为android中必不可少的一部分,android系统为了方便开发人员,在系统中定义了很多的布局文件。 系统布局文件和我们自定义的布局在写法用前缀android以示区别: 系统布局文件...

Android自定义软键盘的实现

先看界面布局文件
  • hfsu0419
  • hfsu0419
  • 2012年08月30日 12:25
  • 62810

android屏幕单位----真机与模拟器获取同一图片显示大小不一样

原文地址::http://blog.csdn.net/danielinbiti/article/details/7310696     这几天做个游戏,设想着场景,不想等分屏幕,最终想到屏幕...

解决nginx下载大文件出现文件损坏,文件大小不一致

小伙伴今天反馈了一个问题,说,网页上传了一个2MB的文件,在网页下载时,只有64KB,并且打开失败。确认该BUG确实存在且必现后,我,踏上了调试解决此BUG之路。1、系统是nginx+php+mysq...

多个五角星 颜色大小不一样

  • 2015年04月27日 15:16
  • 1.87MB
  • 下载

一片小花 颜色大小不一样

  • 2015年04月27日 15:14
  • 4.9MB
  • 下载

opencv在输出不同文件格式输出的时候文件空间的大小不一样

opencv用imwrite可以输出不同的文件格式如bmp,png,jpg这些图片的格式。在main函数中写入一下一串代码时候:       // 读入一幅图像 Mat img; img = i...

为什么du命令与xwindows或者ls显示的大小不一致

在man du命令给出的命令详解是这样的,有两个选项,一个是 --apparent-size               print apparent sizes,  rather  than...

Glide 加载圆角图片大小不一的问题

Glide加载图片出现各个图片圆角大小不一的情况,通过简单的修改加载方式解决此问题。...

CardLayout多个界面大小不一时显示问题

问题:第一个页面刚刚好适合窗口大小,第二个页面比第一个页面大很多,要滚动条才行。当返回第一个页面时,发现第一个页面的位置大小发送了变化,页面大小与第二个页面一样大了。              ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Launcher 应用图标大小不一的情况或GirdView Item 不规则处理与解决
举报原因:
原因补充:

(最多只允许输入30个字)