前段时间我的好朋友他离职了,所以他余留下来的工作就暂时交接给了我,也就是一些客户的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>
简单而又粗暴的解决方式,遇到类似的情况可以参考此类解决方法,谢谢观博!