精华内容
下载资源
问答
  • 如何实现桌面App图标可以动态显示消息数(类似手机上的QQ图标)? 原文:如何实现桌面App图标可以动态显示消息数(类似手机上的QQ图标)? 手机上的APP , 像QQ和微信等都可以在图标动态显示消息数(最大99)...
    原文:如何实现桌面App图标可以动态显示消息数(类似手机上的QQ图标)?

      手机上的APP , 像QQ和微信等都可以在图标上动态显示消息数(最大99) , 那么你有没有想过这些效果是如何实现的?桌面上开发的传统应用程序能否也实现类似的功能?

     1 思路

    •  桌面快捷方式的图标本质上就是基于一个图片产生的 , 第一种是动态生成图标(不过感觉比较费事且也消耗资源) , 建议方式是预先定义从0到99这100个图标(0就是不显示消息数 , >=99的就用99代替);
    •  获取用户的未处理消息数(根据业务情况产生 , 这里不是重点 , 直接用一个数值模拟即可);
    •  先判断该App桌面图标是否存在,存在先删除,然后根据消息数,到程序指定目录下搜寻对应编号的图标文件 , 赋值到创建桌面图标的方法中即可.

    2 图片资源制作

       可以找一个透明背景的png图(如果有美工可以进行自行设计 , 我这里用的Twitter的图标) , 然后用Snagit Editor软件打开 , 在图的右上角添加一个数值标注 , 然后另存为ICO格式.如下图所示:

    3 项目结构

         新建一个C#桌面项目 , 然后创建一个icons文件夹来存放不同编码的图标(演示没必要创建所有 , 有2 到3个作为演示即可) , 值得注意的是 , 一定不要忘了在图标上单击 , 然后在其属性面板中设置将赋值到输出目录 , 否则找不到该图标.

      另外就是要引入一个COM库Windows Script Host Object Model , 来帮助我们创建快捷方式.

    4 核心代码

      直接在默认的Form1窗体加载事件中进行动态图标创建处理 , 看代码:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 using IWshRuntimeLibrary;
    10 using System.IO;
    11 namespace AppWithMsgCount
    12 {
    13     public partial class Form1 : Form
    14     {
    15         public Form1()
    16         {
    17             InitializeComponent();
    18         }
    19 
    20         private void Form1_Load(object sender, EventArgs e)
    21         {
    22             //如何去除桌面快捷方式图标箭头
    23             //未测试!!!!!   cmd /k reg delete "HKEY_CLASSES_ROOT\lnkfile" /v IsShortcut /f & taskkill /f /im explorer.exe & start explorer.exe
    24             ShowMsgCountOnIcon(2);
    25           
    26         }
    27         /// <summary>
    28         /// 显示带消息数目的桌面快捷方式
    29         /// </summary>
    30         /// <param name="msgNum"></param>
    31         /// <returns></returns>
    32         private bool ShowMsgCountOnIcon(int msgNum)
    33         {
    34             try
    35             {
    36                 DeleteShortcut();
    37                // int msgNum = 99;
    38                 CreateShortcut(msgNum);
    39                 this.Text = string.Format("您有{0}个消息", msgNum);
    40                 return true;
    41             }
    42             catch (Exception ex)
    43             {
    44                 this.Text = string.Format("error:{0}", ex.Message);
    45                 return false;
    46             }
    47             finally
    48             {
    49                 
    50             }
    51         }
    52         /// <summary>
    53         /// 如果之前有快捷方式应该先删除再刷新,否则图标不更新
    54         /// </summary>
    55         /// <param name="path"></param>
    56         /// <param name="iconNum"></param>
    57         private static void CreateShortcut(int msgNum)
    58         {
    59             // using IWshRuntimeLibrary; // > Ref > COM > Windows Script Host Object  
    60             string link = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    61                 + Path.DirectorySeparatorChar + Application.ProductName + ".lnk";
    62             var shell = new WshShell();
    63             var shortcut = shell.CreateShortcut(link) as IWshShortcut;
    64             shortcut.TargetPath = Application.ExecutablePath;
    65             shortcut.WorkingDirectory = Application.StartupPath;
    66             //  string appPath = AppDomain.CurrentDomain.BaseDirectory.ToString();
    67             string fullPath = Application.StartupPath + @"\icons\";
    68 
    69             shortcut.IconLocation = string.Format("{0}i{1}.ico", fullPath, msgNum.ToString());
    70             //shortcut...
    71             shortcut.Save();
    72 
    73         }
    74         /// <summary>
    75         /// 删除已有的APP快捷方式
    76         /// </summary>
    77         private void DeleteShortcut()
    78         {
    79             var desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    80             var app = Application.ProductName + ".lnk";
    81             if(System.IO.File.Exists(Path.Combine(desktop, app)))
    82             {
    83                 System.IO.File.Delete(Path.Combine(desktop, app));
    84             }
    85         }
    86     }
    87 }

    5 效果

      为了演示的效果更好 , 对上面的代码稍作修改 , 让他可以在命令行接受参数 , 动态传入消息数.

     

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Windows.Forms;
     5 
     6 namespace AppWithMsgCount
     7 {
     8     static class Program
     9     {
    10         /// <summary>
    11         /// 应用程序的主入口点。
    12         /// </summary>
    13         [STAThread]
    14         static void Main(String[] args)
    15         {
    16             Application.EnableVisualStyles();
    17             Application.SetCompatibleTextRenderingDefault(false);
    18             if (args == null)
    19             {
    20                 Application.Run(new Form1("99"));
    21             }
    22             else {
    23                 if (args.Length == 0)
    24                 {
    25                     Application.Run(new Form1("99"));
    26                 }
    27                 else
    28                 {
    29                     Application.Run(new Form1(args[0]));
    30                 }
    31         }
    32         }
    33     }
    34 }
    View Code

     

    posted on 2015-12-05 09:15 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/5021000.html

    展开全文
  • 每当双 11、12 来临之际,Android 手机 Launcher 中的淘宝、天猫图标就会变成双 11、12 主题的图标。该 Demo 就实现了动态切换图标、名称
  • 于是我就想自己来实现一下一个带动态图标的APP。比如一个时钟,时钟的图标显示根据系统当前时间的秒,分钟和小时线。所有指针都按照当前时间移动。意味着像真正的手表一样可运行的图标,就像给定的图像一样,不用...

          很多年前我是用苹果手机的时候就发现在桌面的图标里系统自带的时钟指南针日历都是会随着实际情况动的,苹果称之为拟物化的风格

                                                                          

          最近在使用安卓,发现安卓的手机也实现了这样的功能。于是我就想自己来实现一下一个带动态图标的APP。比如一个时钟,时钟的图标显示根据系统当前时间的秒,分钟和小时线。所有指针都按照当前时间移动。意味着像真正的手表一样可运行的图标,就像给定的图像一样,不用打开APP就可以看到时钟的显示。

           行动开始,我先去查阅一些资料,发现事情并不简单。研究后发现,对于第三方应用程序来说,这是不可能的,日历应用程序和闹钟应用程序都有特殊的hook。通常,应用程序无法更新其图标。Android SDK中没有支持动态应用程序图标的东西。但是使用了N个不同的“activity-alias”,它们都指向相同的实现,但是具有不同的图标。

           具体的代码如下

       AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.dynamiciocn">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
    
            <activity
                android:name=".MainActivity"
                android:label="改变前的">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <activity-alias
                android:name=".test"
                android:enabled="false"
                android:icon="@drawable/one"
                android:label="改变后的"
                android:targetActivity=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity-alias>
    
        </application>
    
    </manifest>

    MainActivity.java

    package com.example.dynamiciocn;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.content.pm.PackageManager;
    import android.content.ComponentName;
    import android.view.View;
    public class MainActivity extends AppCompatActivity {
    
    
        private ComponentName defaultComponent;
        private ComponentName testComponent;
        private PackageManager packageManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //拿到当前activity注册的组件名称
            ComponentName componentName = getComponentName();
    
            //拿到我们注册的MainActivity组件
            defaultComponent = new ComponentName(getBaseContext(), "com.example.dynamiciocn.MainActivity");  //拿到默认的组件
            //拿到我注册的别名test组件
            testComponent = new ComponentName(getBaseContext(), "com.example.dynamiciocn.test");
    
            packageManager = getApplicationContext().getPackageManager();
        }
    
        public void changeIcon(View view) {
            disableComponent(defaultComponent);
            enableComponent(testComponent);
        }
    
        public void changeDefaultIcon(View view) {
            enableComponent(defaultComponent);
            disableComponent(testComponent);
        }
    
        /**
         * 启用组件
         *
         * @param componentName
         */
        private void enableComponent(ComponentName componentName) {
            int state = packageManager.getComponentEnabledSetting(componentName);
            if (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
                //已经启用
                return;
            }
            packageManager.setComponentEnabledSetting(componentName,
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP);
        }
    
        /**
         * 禁用组件
         *
         * @param componentName
         */
        private void disableComponent(ComponentName componentName) {
            int state = packageManager.getComponentEnabledSetting(componentName);
            if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
                //已经禁用
                return;
            }
            packageManager.setComponentEnabledSetting(componentName,
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);
        }
    }
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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"
        android:orientation="vertical"
        tools:context="com.example.dynamiciocn.MainActivity">
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="改变图标"
            android:onClick="changeIcon"/>
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="改回默认图标"
            android:onClick="changeDefaultIcon" />
    
    </LinearLayout>

     

    实现的效果如下

                                                         

    参考档案:https://developer.android.com/guide/topics/manifest/activity-alias-element

    展开全文
  • Qt自定义动态图标的实现

    千次阅读 2013-07-06 23:45:45
    常常我们在用Qt做界面的时候,往往需要有一个漂亮的界面,类似于手机里面的各种图标按键,因此,本文考虑如何实现图标按键 Qt里面有个QPushButton的类,首先,用Qt自带的QPushButton实现一个按键,如下图效果所示 ...


    常常我们在用Qt做界面的时候,往往需要有一个漂亮的界面,类似于手机里面的各种图标按键,因此,本文考虑如何实现图标按键

    Qt里面有个QPushButton的类,首先,用Qt自带的QPushButton实现一个按键,如下图效果所示

    首先,这个按钮不是动态的,因此,没有动态效果,其次,我们多数情况下有自己的按键图标,这个时候C++继承的作用就发挥出来了,我们在QPushButton的基础上派生出一个子类QIconButton,并重新实现其中的一些事件。首先,实现一个动态效果,当鼠标放在按键的位置,则按键变大表示选中按键,鼠标离开的时候,则按键恢复,先看效果,如下所示

    这样,就实现了按键的动态特性了,当然,此时图标还是比较丑,不过,先暂时不管

    动态效果实现原理:重写事件enterEvent和leaveEvent两个虚拟函数即可,在事件里面进行重新设置图标大小

    //------------------------
    void QIconButton::enterEvent(QEvent *event)
    {
        SetDynamicButtonSize(true);
    }
    
    void QIconButton::leaveEvent(QEvent *event)
    {
        SetDynamicButtonSize();
    }
    

    接下来就是做加载图片,作为图标了,效果如下图所示

    图标的加载方法主要是,首先,将ICON加载到画布上,让后将画布复制到对话框上即可,代码如下

    void QIconButton::paintEvent(QPaintEvent *event)
    {
    //    QPushButton::paintEvent(event);
    //    return;
    
    
        QPainter     t_Painter(this);
        t_Painter.setRenderHint(QPainter::Antialiasing);
    
        int          t_nButtonRadius(QIconButtonRadius);
        QPainterPath t_Path;
        t_Path.addRoundedRect(this->rect(), t_nButtonRadius, t_nButtonRadius);
    
        QRect        t_Rect(this->rect());
        if ( m_sUrl != "" )
        {
            // draw Icon to Pixmap
            QPixmap  t_Pixmap(t_Rect.size());
            QPainter t_PainterPixmap(&t_Pixmap);
            t_PainterPixmap.save();
            if ( this->isChecked() )
                t_PainterPixmap.drawPixmap(t_Rect, QIcon(m_sUrl).pixmap(t_Rect.size(), QIcon::Selected));
            else
                t_PainterPixmap.drawPixmap(t_Rect, m_sUrl);
            t_PainterPixmap.restore();
    
            //draw pixmap to widget
            t_Painter.fillPath(t_Path, QBrush(t_Pixmap));
        }
    }
    
    接下来实现我们常见的,选中一个图标的时候,往往边框会有不同的颜色突出,如下所示
    
    

    该实现方法依然是在paintEvent事件中完成的,代码如下所示

        //draw focus frame
        if ( m_bEnter )
        {
            t_Painter.setPen(QPen(QIconButton_COLOR_SELECT, 5));
            t_Painter.drawRoundRect(t_Rect, t_nButtonRadius, t_nButtonRadius);
        }
        else
        {
            if ( this->isChecked() )
            {
                t_Painter.setPen(QPen(Qt::blue, 5));
                t_Painter.drawRoundRect(t_Rect, t_nButtonRadius, t_nButtonRadius);
            }
        }

    通过以上几个步骤就完成了,动态图标的制作,并且,如果后面我们还需要什么效果,我们还可以再次方法上派生出子类,进行改进



    展开全文
  • 动态刷新桌面图标

    2016-08-17 10:31:59
    桌面上的日历图标,显示当天的日期和星期几 实现:  当前手表没有调节时间的功能,是通过与手机蓝牙连接后,同步手机的时间。  手表桌面监听 ACTION_TIME_TICK 和 ACTION_TIME_CHANGED 广播  ACTION_TIME_TICK是...


    需求;桌面上的日历图标,显示当天的日期和星期几

    实现:

          当前手表没有调节时间的功能,是通过与手机蓝牙连接后,同步手机的时间。

          手表桌面监听  ACTION_TIME_TICK  和  ACTION_TIME_CHANGED 广播

         ACTION_TIME_TICK是系统每分钟发的广播

         ACTION_TIME_CHANGED是当蓝牙重新连接或手机时间改变时,手机发过来的广播,手机监听ACTION_TIME_CHANGED和 ACTION_TIMEZONE_CHANGED

         

         

          

    展开全文
  • Android动态更新APP图标

    千次阅读 2018-03-30 09:40:10
    一、简介 现在诸多APP在特殊的日子都会将APP的图标修改为相对应图标,懂开发的人肯定会想我没有更新APP啊,为什么APP的图标换了呢...再次回到手机桌面,则会发现APP图标已经改变,效果图如下所示: 修改图标...
  • 动态更新桌面图标

    2020-10-29 15:05:20
    前言:每当临近双十一,手机里一些购物的APP桌面logo都在无感知情况下换成了活动主题logo。 方案:(1)热更新(2)使用Activity-alias,本文主要介绍该方式 实现: 1、AndroidManifest.xml中添加activity-alias ...
  • 总共125个图片,基本为动态图,主要是HOT和NEW图表,其他还有一些常见的小图标,整理手机,综合报道。
  • Android9.0以上非小米手机,在动态修改图标后,最近任务列表不显示本应用的问题 这个问题可以用资源文件夹限定符解决: 首先找到AndroidManifest文件中的启动页别名配置,如下: <activity-alias android:...
  • Android动态更换APP图标及名称

    万次阅读 热门讨论 2017-12-15 14:53:06
    前言本来想研究一加手机上的天气APP,会随着每天的天气、温度不同动态的改变APP的图标是如何实现的,但始终没有想出和查阅到相关方法,毕竟是人家自己的系统APP。但是也找到了一种能动态改变图标的方法,这里做一下...
  • App动态修改图标包名

    2019-08-01 15:07:04
    细心的朋友会发现,现在火热的京东,天猫等app的icon 在手机中不知道什么时候发生了改变,尤其是在618,818等活动,改变了图标,但是奇怪的是我们并没有更新软件,这个图标怎么就变了,作为android开发者就来分析实现...
  • 在我的在实际开发中,动态修改图标的功能不在应用首页,一般都会在设置或者界面样式修改这样比较深层次的界面中,如果使用上篇博文,便会导致切换图标后,我的手机桌面出现两个不同图标的同款应用,卸载一个后另一个...
  • 求大神告知,如何动态修改一个Android程序的图标呢?现在要求是后台有推送消息,现在需要把接收到的推送消息用一个红色数字显示到应用程序图标的右上角,IOS的APP基本都有这个效果,可是安卓怎么去实现呢?我现在...
  • 在安卓手机上有时候我们没有更新APP,但是APP的手机桌面图标变了,其实这是利用了 Activity的一个叫&lt;activity-alias&gt;的属性。对于 Activity 组件,使用时需要在 Manifest 文件中通过 标签注册 name、...
  • 1、在手机桌面加载图标方式 1)、动态加载 Launcher.java private void addSourceList() { Intent launchIntent = new Intent(this, RcGrpActivity.class); launchIntent.setAction(Intent.ACTION_
  • 安卓代码动态切换APP启动图标

    千次阅读 2017-02-09 13:33:55
    转载请注明出处 ... 每当双11时,手机中的“天猫”的图标就会变成双11主题的图标。这是怎么实现的呢? 有人说是更新App,没错,可以实现。但是有些大材小用了,毕竟更新一个版本。 个人猜测是在双11前
  • 动态更换App图标这件事,在用户里总是存在需求的:有些用户喜欢“美化”自己的手机。至于用户们喜欢美化到什么程度,这得看个人需求。有的用户想定制个性的App图标,那么各大iPhone论坛里都有方法可以不越狱更改App...
  • Android 主界面应用图标动态修改

    千次阅读 2013-12-20 18:18:13
    使用android 手机的用户,大多数人都喜欢将自己常用的应用放置于主界面上面;对于放置于桌面上的应用图标,系统具有两个接口允许所有的应用通过广播的方式进行删除和添加; 例如: static final String ACTION_...
  • iOS 10.3 开放了更换 app 图标的 API,核心方法是下面这个:。。每周更新关注:http://weibo.com/hanjunqiang 新浪微博!手机加iOS开发者交流QQ群: 446310206
  • android标题栏、状态栏图标文字颜色及背景动态变化

    万次阅读 多人点赞 2017-06-22 14:22:30
    android中沉浸式状态栏的文章已经满大街了,可是在实现某些效果时,还是得各种搜索,测试一通后,最后还常常满足不了要求,即使好不容易在一部手机上满足了需求,放在另外一手机上,发现效果差强人意。今天把自己这...
  • 基于上述需求,希望可以不用通过修改后重新编译给APK的方式,在客户手机上已安装我们公司APP的前提下,动态修改快捷方式的图片,名字等。 程序中的壁纸,LOGO可以通过服务端下发,动态修改,但是已经安装在手机上的...
  • android中沉浸式状态栏的文章已经满大街了,可是在实现某些效果时,还是得各种搜索,测试一通后,最后还常常满足不了要求,即使好不容易在一部手机上满足了需求,放在另外一手机上,发现效果还各种不适配。...
  • 原帖地址:...在小米 三星 索尼 手机图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的。 小米已经测试通过了 1.原生系统(原生的La

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 392
精华内容 156
关键字:

手机动态图标