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

前段时间我的好朋友他离职了,所以他余留下来的工作就暂时交接给了我,也就是一些客户的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>

简单而又粗暴的解决方式,遇到类似的情况可以参考此类解决方法,谢谢观博!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Engineer-Jsp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值