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>

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

修改Launcher3中的workspace中的应用图标的大小

以下函数是把从数据库中加载的应用的信息绑定到workspace中。     public void bindItems(final ArrayList shortcuts, final int sta...

Launcher2修改--快捷界面和All Apps Icon大小和背景(二)

这里的修改均以横屏,分辨率为800*480为例,因为屏不同方向和分辨率使用的资源是不一样的,下面先来看下修改前后的对比图 修改前是4x4: 修改后是3x5: 修改的文件有layout-land...

Android瀑布流StaggeredGridView学习研究

关于Android瀑布流控件,已经在江湖上,流传已久,超过两年时间了。网上也有很多相关学习资源,可以拿来研究学习。github上,就有两个资源,可以供学习者膜拜。 1.https://github.c...

Android自定义控件StaggeredGridView-瀑布流效果的GridView

我们知道谷歌keep在显示记事的时候可以多列显示,但是跟国内很多应用不同,它的记事之间高度是随机的,效果如下: 因为之前没有用过GridView,但是知道GridView大概是怎么回事,...

Android GridView实现多种不同布局样式显示数据

刚刚步入Android开发领域的时候,一次一个项目需要用一个GridView实现多种不同的布局样式效果,当时看到这个需求直接就懵了,感觉挺不可思议的想法。下面就来看下这个多重布局在同一个GridVie...

Android必知必会-App 常用图标尺寸规范汇总

内容持续更新中,更新日期:2016-08-111. 程序启动图标(icon launcher)放在mipmap-*dpi下,文件名为ic_launcher.png LDPI (Low Density ...

解决Android当中GridView的Item子控件中有ImageView图片大小不一致问题,动态设置ImageView控件大小

大体思想是根据屏幕大小动态定义

Android中GridView 如何正方形显示图片并适配手机

刚刚做了一个项目,是做应用墙相关的,就是把一个个应用的图标和名称显示到GridView中。本来想着,像GridView这样常用成熟的控件,使用应该非常的简单,但真正在项目中实现起来,就有各种各样的小问...

安卓icon图标大小标准,以及mdpi等对应放置的图片大小

桌面图标大小标准 各个图片文件放置图片大小的标准

RecyclerView自定义LayoutManager,打造不规则布局

RecyclerView的时代自从google推出了RecyclerView这个控件, 铺天盖地的一顿叫好, 开发者们也都逐渐从ListView,GridView等控件上转移到了RecyclerVie...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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