仿android系统Launcher界面

一个效果很华丽的仿桌面APP,却胜似Launcher 一个效果很华丽的仿桌面APP,却胜似Launcher。干货熬制许久,此刻为大家献上。 阅读详情

写的我要吐血了。。。是不是我太菜了?

放出代码.....

res-->layout-->activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >

   <!-- 定义一个ViewSwitcher组件 -->
   <ViewSwitcher 
       android:id="@+id/viewSwitcher"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"/>
   
   <!-- 定义滚动到上一屏的按钮 -->
   <Button 
       android:id="@+id/button_prev"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_alignParentLeft="true"
       android:onClick="prev"
       android:text="<"/>
   
   <!--定义滚动到下一屏的按钮  -->
   <Button 
       android:id="@+id/button_next"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="true"
       android:layout_alignParentRight="true"
       android:onClick="next"
       android:text=">"/>

</RelativeLayout>

res-->layout-->labelicon.xml

<?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:orientation="vertical"
    android:gravity="center" >
    <ImageView 
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView 
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"/>

</LinearLayout>
res-->layout-->slidelistview.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:numColumns="4"
  android:layout_height="match_parent">
    
</GridView>

res-->anim-->slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 设置从右边拖进来的动画
    android:duration指定动画持续时间  -->
	<translate
		android:fromXDelta="100%p"
		android:toXDelta="0"
		android:duration="@android:integer/config_mediumAnimTime" />
</set>
res-->anim-->slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 设置从左边拖出去的动画 
    android:duration指定动画持续时间 -->
	<translate
		android:fromXDelta="0"
		android:toXDelta="-100%p"
		android:duration="@android:integer/config_mediumAnimTime" />
</set>

MainActivity.java

package com.demo.viewswitcherdemo;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ViewSwitcher;
import android.widget.ViewSwitcher.ViewFactory;

public class MainActivity extends Activity {
	//定义一个常量,用于显示每屏显示的应用程序数
	public static final int NUMBER_PER_SCREEN = 12;
	//代表应用程序的内部类
	public static class DataItem{
		//应用程序名称
		public String dataName;
		//应用程序图标
		public Drawable drawable;
	}
	//保存系统所有应用程序的List集合
	private ArrayList<DataItem> items = new ArrayList<DataItem>();
	//记录当前正在显示第几屏的程序
	private int screenNo = -1;
	//保存程序所占的总屏数
	private int screenCount;
	
	ViewSwitcher switcher;
	//创建LayoutInflater对象
	LayoutInflater inflater;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		inflater = LayoutInflater.from(MainActivity.this);
		//创建一个包含40个元素的List集合,用于模拟包含40个应用程序
		for(int i=0; i<40; i++){
			String label = "" + i;
			Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
			DataItem item = new DataItem();
			item.dataName = label;
			item.drawable = drawable;
			items.add(item);
		}
		//计算应用程序所占的总屏数
		//如果应用程序的数量能整除Number_per_screen,除法的结果就是总屏数
		//如果不能,总屏数应该是除法的结果再加1
		screenCount = items.size() % NUMBER_PER_SCREEN == 0 ? items.size() / NUMBER_PER_SCREEN: items.size() / NUMBER_PER_SCREEN + 1;
		switcher = (ViewSwitcher)findViewById(R.id.viewSwitcher);
		switcher.setFactory(new ViewFactory(){
			//实际上就是返回一个GridView组件
			@Override
			public View makeView() {
				//加载这个组件,实际上就是一个GridView组件
				return inflater.inflate(R.layout.slidelistview, null);
			}
			
		});
		//页面加载时先显示第一屏
		next(null);
	}
	public void next(View v){
		if(screenNo < screenCount - 1){
			screenNo++;
			//为ViewSwitcher的组件显示过程设置动画
			switcher.setInAnimation(this,R.anim.slide_in_right);
			//为ViewSwitcher的组件隐藏过程设置动画
			switcher.setOutAnimation(this,R.anim.slide_out_left);
			//控制下一屏将要显示的GridView对应的Adapter
			((GridView)switcher.getNextView()).setAdapter(adapter);
			switcher.showNext();
		}
	}
	public void prev(View v){
		if(screenNo > 0){
			screenNo--;
			//为ViewSwitcher的组件显示过程设置动画
			switcher.setInAnimation(this,R.anim.slide_out_left);
			//为ViewSwitcher的组件隐藏过程设置动画
			switcher.setOutAnimation(this,R.anim.slide_in_right);
			//控制下一屏将要显示的GridView对应的Adapter
			((GridView)switcher.getNextView()).setAdapter(adapter);
			switcher.showPrevious();
		}
		
	}
	//该BaseAdapter负责为每屏显示的GridView提供列表项
	private BaseAdapter adapter = new BaseAdapter(){

		@Override
		public int getCount() {
			// 如果已经到了最后一屏幕,且应用程序的数量不能整除Number_per_screen
			if(screenNo == screenCount -1 && items.size() % NUMBER_PER_SCREEN != 0){
				//最后一屏显示的程序数为应用程序的数量对number_per_screen求余
				return items.size() % NUMBER_PER_SCREEN;
			}
			//否则每屏显示的程序数量为Number_per_screen
			return NUMBER_PER_SCREEN;
		}

		@Override
		public DataItem getItem(int position) {
			// 根据screenNo计算第position个列表项的数据
			return items.get(screenNo * NUMBER_PER_SCREEN + position);
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view = convertView;
			if(convertView == null){
				//加载R.layout.labelicon布局文件
				view = inflater.inflate(R.layout.labelicon, null);
			}
			//获取R.layout.labelicon布局文件中的ImageView组件,并为之设置图标
			ImageView imageView = (ImageView)view.findViewById(R.id.imageview);
			imageView.setImageDrawable(getItem(position).drawable);
			//获取Textview
			TextView textView = (TextView)view.findViewById(R.id.textview);
			textView.setText(getItem(position).dataName);
			return view;
		}};

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}



安卓Android源码分析与Launcher定制实战 Android源码是由多个模块组成的复杂系统。这些模块可以分为应用程序框架、系统服务、硬件抽象层(HAL)、运行时环境以及底层Linux内核。开发者在进行定制和优化时,通常需要深入理解这些模块以及它们之间的关系。在开发过程中,引入持续集成(Continuous Integration)的思想,可以有效提高开发效率和源码质量。通过持续集成工具,如Jenkins、Travis CI等,可以自动化编译、测试过程,减少人为干预。在Android系统中,模块负责动态主题的显示和音频主题的管理。 阅读详情

相关推荐

用Seurat和ComplexHeatmap绘制单细胞marker基因热图:从数据处理到可视化全流程

本文详细介绍了使用Seurat和ComplexHeatmap绘制单细胞marker基因热图的全流程,涵盖从数据处理、基因筛选、平均表达矩阵计算到高级可视化与注释添加。重点解析了如何利用ComplexHeatmap生成发表级热图,并整合热词信息,解决单细胞数据可视化中的常见问题,提升科研图表质量。

weixin_29048775的博客 530

android原生launcher3替换apk桌面图标

Android 8.1 去掉 Launcher3 默认给 icon 增加的白边 android的新特性,目前定制后已将此功能关闭,但是chrome始终有白色的一圈,定位在chrome apk自己的android:icon资源就是如此,由此引发出与其他的apk图标风格不一致,看起来别扭,就想从launcher替换一下。 参考: Android P 上Launcher3 中实现两种方式替换桌面图标 由于安装和预置在显示桌面图标的代码不同,所以通过trace代码,找到了公共必走的路径: packages/apps

通信侠的博客 2512

HMMER实战:从零部署到序列分析

本文详细介绍了HMMER工具的安装与使用,从源码编译到环境配置,再到核心工具hmmbuild、hmmsearch等的实战应用。通过球蛋白序列分析案例,展示了HMMER在生物信息学中的强大功能,帮助读者快速掌握序列分析技巧。

weixin_42529366的博客 253

android原生桌面,谷歌官方出品的安卓原生桌面App 轻松干掉你手机上臃肿的的桌面!...

原标题:谷歌官方出品的安卓原生桌面App 轻松干掉你手机上臃肿的的桌面!安卓手机桌面软件茫茫多,好看的,实用的,简洁的,应有尽有,但大部分人还都使用着比如,华为手机,小米,魅族,VIVO等等手机的原生桌面,手机OS桌面虽然越做越漂亮了,但也有看腻的那一天,谷歌推出的“质感设计”是安卓系统的风向标,华为,小米,魅族等厂商都在像其靠拢,而谷歌最新推出的一款桌面软件,让你不用换机,就能体验到原生安卓系统...

weixin_33433927的博客 7099

OpenClaw Docker 安装问题解决全记录

控制面板无法加载(WebSocket 错误) | 确认 Nginx 配置中的 `Upgrade` 和 `Connection` 头正确 || 网关容器无法启动 | `docker compose logs openclaw-gateway`,检查权限、镜像名 |如需消除,使用 Let's Encrypt |- `<your-token>`:你的 OpenClaw 网关令牌(如 `b0e5ab...`)将 `<nas-ip>` 替换为你的群晖内网 IP(例如 `192.168.1.100`)。

u014490376的博客 2308

半导体AMHS系统振动控制技术演进:从0.5G到超低振动的工艺革命

在半导体制造进入埃米级时代后,AMHS的振动控制能力将成为区分厂商技术等级的标尺。国内企业通过“弹性机械设计-混合主动控制-智能调度”的三重创新,正逐步突破0.2G阈值,支撑12英寸晶圆厂向3nm/2nm制程升级。未来,振动抑制不再仅是物流系统的性能参数,而是与光刻、刻蚀等核心工艺深度耦合的基础能力,这将重塑半导体设备产业的竞争格局。

m0_60674045的博客 1584

安卓原生系统_你没有用过的安卓系统:原生安卓桌面体验

国内的安卓系统,被改的面目全非,特别是桌面,更是少了好多功能。谷歌安卓的桌面,有很多新特性,但是由于国内定制版的安卓系统,为了统一,硬生生的阉割了很多的功能。不要担心,来看看一下类似原生安卓桌面的桌面是什么样子吧~Nova LauncherNova是一款老牌的桌面,用户量很大,在早期的安卓的时候就出现了,一直到了现在都还在更新。支持安卓10的特性,图标包等都不在话下。启动软件会让你选择一个布局,如...

weixin_39615984的博客 1648

010Editor实战:5分钟破解Zip伪加密文件(附BUUCTF真题解析)

本文详细介绍了如何使用010Editor快速破解Zip伪加密文件,包括BUUCTF真题的完整解析。通过修改关键字节,轻松解除伪加密状态,适用于CTF竞赛和实际工作场景,提升文件处理效率。

weixin_29325007的博客 326

android自定义桌面(launcher)

有时候需要开发一个自己的桌面程序,特别是做产品开发的开发人员,android自定义桌面其实就是一个launcher,然后在相应的activity中把系统中的所有APK加载进来,显示相应的icon图标。 开发自定义桌面需要用到以下几个类 1,ComponentName:组件名称,通常用来打开其他应用程序中的Activity或服务。, 2,PackageInfo:包含了一些信息的基类,它的直接子

cjyusha的专栏 8384

AI赋能软件测试:从冒烟测试到全流程智能化的效率革命

软件测试是确保软件质量的关键环节,其核心原理是通过预设用例验证系统功能是否符合预期。传统测试方法依赖人工编写和维护脚本,面临维护成本高、适应性差等挑战。随着人工智能技术的发展,特别是自然语言处理和计算机视觉的成熟,AI为测试领域带来了新的技术价值。通过让AI理解应用界面和业务逻辑,可以实现测试用例的智能生成、自主执行和结果分析,显著提升测试效率和覆盖率。在实际应用场景中,AI驱动的冒烟测试能够动态适应UI变化,自动分析失败日志,将测试人员从重复劳动中解放出来,专注于更复杂的质量策略设计。本文基于AI在冒烟测

weixin_28841265的博客 306

自建 HTML获取腾讯六宫格点选图片验证码素材,实现刷新批量获取图片方便训练

通过自建 HTML 页面,可以方便地获取腾讯六宫格二维码素材,不仅过程简单,而且可以灵活配置各种参数。希望这篇文章能帮助到需要相关素材的小伙伴。如果你有其他问题或者更好的方法,欢迎留言交流!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 489

android系统launcher,仿android系统Launcher界面

写的我要吐血了。。。是不是我太菜了?放出代码.....res-->layout-->activity_main.xmlxmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent">android:id="@+...

weixin_42508903的博客 409

Python和Spyder:一个完美的编程组合

而Spyder作为一个专门为科学计算和数据分析而设计的IDE,提供了高效的开发环境和丰富的工具。无论是初学者还是专业开发者,Python和Spyder都能满足他们的需求,并为他们的工作带来便利和效率。本文将探讨Python和Spyder之间的关系,以及它们如何相互配合,提供一流的编程体验。每个工具都有其特定的优势和适用场景,开发者可以根据自己的需求选择合适的工具。而Spyder作为一个专门为科学计算而设计的IDE,提供了编写、调试和执行Python代码的环境。

CodeHeroicX的博客 1123

ViewAnimator之ViewSwitcher的简单功能和用法(仿Android系统的Launcher界面)

(仿Android系统的Launcher界面)package com.test.viewswitvher;import java.util.ArrayList;import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.Lay

金字塔顶的蜗牛博客 1007

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android viewswitcher分屏显示仿launcher系统界面实现左右滑动效果

ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果. 为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创...

安卓兼职framework和app工程师的博客 744

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android仿工厂测试功能,使用SwitcherView仿Android系统Launcher界面

public classMainActivity extendsActivity{// 定义一个常量,用于显示每屏显示的应用程序数public static final intNUMBER_PER_SCREEN= 16;// 代表应用程序的内部类,public static classDataItem{// 应用程序名称publicString dataName;// 应用程序图标publicDr...

weixin_36341500的博客 248

[Android]笔记20:ViewAnimator-仿android系统launcher界面

ViewAnimator是一个基类,它继承了FrmaeLayout,因此他表现出FrmaeLayout的特征,可以将多个View组件,叠在一起,可以在view切换时展现出动画效果。 ViewAnimator重要属性如下: XML 属性 描述 android:animateFirstView 定义 ViewAnimation 首次显示时是否对当前视图应用动画 android:i

德仔 1434

android仿系统Launcher界面,实现分屏,左右滑动效果(ViewSwitcher)

ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果.为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建...

weixin_30800807的博客 669

android 仿iphone主题之主菜单

android仿iphone主题      现在很多第三方Launcher((如360Launcher,GoLauncher)带有iphone主题,相信玩Android的人大都知道。      本例实现仿iphone主题的launcher的冰山一角。如下图:             从效果看,大概就能猜出用什么控件类(支持左右滑动的控件类+GridView),支持左右滑动的控件类,有很

BeiHaiZuoPeng的专栏 1045

Android 系统桌面 App —— Launcher 开发(1)

Launcher就是Android系统的桌面,俗称“HomeScreen”也就是我们开机后看到的第一个App。launcher其实就是一个app,它的作用是显示和管理手机上其他App。目前市场上有很多第三方的launcher应用,比如“小米桌面”、“91桌面”等等。

fromVillageCoolBoy的博客 1万+

Android 系统桌面 App —— Launcher 开发

Launcher就是Android系统的桌面,它也是一个app,用于管理其他的app。

Alpinist Wang 1万+

Android 定制自己的launcher

launcher(安卓系统桌面启动器) launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launcher出错的时候,安卓系统会出现“进程 com.android.launcher 意外停止”的提示窗口。这时需要重新启动Launcher。

android程序猿HJ的博客 2万+

Android11系统之Launcher启动流程

本文的内容主要是分析安卓系统源码,可能阅读起来会有点枯燥,所以最好可以跟着源码走一遍流程,学习源码没有捷径。 本文源码基于Android 11 Launcher 进程即 Android 系统桌面,也是一个应用程序,作为应用程序,那么启动过程就少不了AMS(ActivityManagerService),AMS是 Android 系统中最核心的系统服务,几乎所有的APP应用都需要与AMS通信 Launcher 也不例外,本文先分析AMS启动再走到 Launcher 进程。 AMS的启动过程 从上篇.

永琪的博客 8433

Android 11 Framework 优化:屏蔽“系统启动中”提示,直达 Launcher

本文介绍了在Android 11平台上优化开机体验的实现方案。通过在Framework层修改代码,主要实现了三个关键优化:1)延迟退出开机动画直到真正的Launcher绘制完成;2)移除原有的开机动画退出逻辑;3)屏蔽默认的"系统启动中"过渡界面(FallbackHome)。这些修改使得开机动画能够持续显示,直到桌面完全加载完成,实现了从开机到桌面的无缝视觉过渡。具体修改涉及ActivityRecord.java、WindowManagerService.java和FallbackHom

u010345983的博客 3766

安卓系统Launcher的开发

Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launcher出错的时候,安卓系统会出现“进程 com.android.launcher 意外停止”的提示窗口。这时需要重新启动桌面Launcher。 安卓系统Launcher的开发   一、主要文件

samsam2013的博客 1188

Android系统中Launcher应用是被谁启动的

在 Android 系统中,Launcher是一个重要的应用,它负责显示主屏幕、管理应用程序图标和提供启动应用程序的界面。Launcher 是由启动和管理的,具体来说,Launcher 的启动过程涉及多个 Android 系统组件和机制。

netwalk的专栏 1634
上一篇: Eclipse自动补全快捷按钮设置
下一篇: 几行代码看程序员的水平——Android文件命名规范
Timesongs
博客等级 码龄14年 15粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值