• android 动态改变SVG颜色 废话不多说,直接撸代码 关于SVG的生成与动画,在此不做描述  VectorDrawableCompat vectorDrawableCompat = VectorDrawableCompat.create(getResources(),R.drawable.ic_home_black_24

    android 动态改变SVG的颜色

    废话不多说,直接撸代码


    关于SVG的生成与动画,在此不做描述

      VectorDrawableCompat vectorDrawableCompat = VectorDrawableCompat.create(getResources(),R.drawable.ic_home_black_24dp,getTheme());
      //你需要改变的颜色
      vectorDrawableCompat.setTint(getResources().getColor(R.color.color_blue));
      YourImageView.setImageDrawable(vectorDrawableCompat)

    展开全文
  • 在代码内部动态改变图片颜色,注意:只能改变纯色图片颜色,如图片包含两种及以上颜色,会整个图片的颜色变为相应颜色
  • 最近在工作中,碰到了一个需要动态修改图片颜色的需求,网上也是查了不少资料,没有找到自己想要的,后来是在爬别人项目的代码中,才找到了动态修改android svg图片颜色的方式,现在容我一一道来 首先,想要在...

    时隔3年,庆幸自己还在安卓开发这一行,也算是累计了些知识,现在在工作之余,也有些时间来记录些自己平时使用的一些技术,希望这次回来,可以捡起这份博客,写一些自己喜欢的内容。

    最近在工作中,碰到了一个需要动态修改图片颜色的需求,网上也是查了不少资料,没有找到自己想要的,后来是在爬别人项目的代码中,才找到了动态修改android svg图片颜色的方式,现在容我一一道来

    首先,想要在android项目中使用svg,需要将美工妹纸(我们这里为啥是个汉子o(╥﹏╥)o)提供的svg图片使用工具

    链接: https://pan.baidu.com/s/1HvDHYVPfLIw1zho0NbKT3A 提取码: fvuq

    转换成xml后才能使用(下载后,打开index.html即可)

    接下来就是使用svg及修改颜色的重头戏,先贴代码

    @BindingAdapter(value = {"model", "svgColor"})
        public static void loadVectorDrawable(ImageView imageView, String model, int svgColor){
            Drawable drawable = null;
            switch (model){
                case Constant.MODEL_ANDROID:
                    //mutate,使当前drawable可变
                    drawable = ContextCompat.getDrawable(imageView.getContext(), R.drawable.svg_android).mutate();
                    break;
                case Constant.MODEL_IPAD:
                    drawable = ContextCompat.getDrawable(imageView.getContext(), R.drawable.svg_ipad).mutate();
                    break;
                case Constant.MODEL_MACBOOK:
                    drawable = ContextCompat.getDrawable(imageView.getContext(), R.drawable.svg_macbook).mutate();
                    break;
                case Constant.MODEL_WINDOWS:
                    drawable = ContextCompat.getDrawable(imageView.getContext(), R.drawable.svg_windows).mutate();
                    break;
                case Constant.MODEL_IOS:
                    drawable = ContextCompat.getDrawable(imageView.getContext(), R.drawable.svg_iphone).mutate();
                    break;
                default:
                    drawable = ContextCompat.getDrawable(imageView.getContext(), R.drawable.svg_other).mutate();
            }
            //你需要改变的颜色
            Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
            wrappedDrawable.setTint(svgColor);
            imageView.setImageDrawable(wrappedDrawable);
        }

    项目中使用了databinding,所以贴出的代码中使用了databinding的bindingAdapter,adapter中传入两个参数,分别是用于区分使用哪个svg及svg的颜色

    需要特别注意的是将svg的xml文件转换为drawable的方法中,使用了mutable()方法,只有添加了该方法,才能多次修改drawable的颜色,具体修改颜色的方法是调用drawable的setTint方法,接下来就是将drawable添加到imageview就完成了

    android中本身是支持svg的,所以说使用起来还是比较简单的,如果有哪里写的不对,欢迎指正

    展开全文
  • 最近在学习Android的开发,今天在用SVG图片的时候,更改SVG图片xml文件的path里面的fillColor时,发现在设计器上面是有用的,但是在模拟器(API16,Android4.1.2)上面没用,首先以为是Android版本的问题,然后创建...

    最近在学习Android的开发,今天在用SVG图片的时候,更改SVG图片xml文件的path里面的fillColor时,发现在设计器上面是有用的,但是在模拟器(API16,Android4.1.2)上面没用,首先以为是Android版本的问题,然后创建了一个新的模拟器(API21,Android5.0),发现果然生效了。巴拉巴拉……

    进入正题吧,颜色设置无效跟安卓4.1.2没关系,是因为我在SVG图片xml文件的path里面的fillColor的颜色值使用的是color资源文件里面设置的颜色,所以无效,直接使用颜色值就行了。

    在下图中,直接设置fillColor为具体的数值,经过测试在API16的情况下是生效的



    下图,使用资源文件中的颜色作为fillColor,经过测试在API16无效,在API23生效。


    展开全文
  • Android使用SVG小结

    2017-05-18 16:37:47
    android也在5.0中新增了对使用svg矢量图支持,现在网上也有大把关于svg的文章但是使用时还是有遇到了许多坑,所以在这里我就总结了下我在使用svg过程中遇到的各种坑,希望对大家有所帮助。VectorDra

    SVG的全称是Scalable Vector Graphics,叫可缩放矢量图形。它和位图(Bitmap)相对,SVG不会像位图一样因为缩放而让图片质量下降。它的优点在于节约空间,使用方便。

    android也在5.0中新增了对使用svg矢量图支持,现在网上也有大把关于svg的文章但是使用时还是有遇到了许多坑,所以在这里我就总结了下我在使用svg过程中遇到的各种坑,希望对大家有所帮助。

    VectorDrawable

    要想在Android使用svg,首先要介绍的肯定是VectorDrawable,VectorDrawable是Android 5.0系统中引入了 VectorDrawable 来支持矢量图(SVG),同时还引入了 AnimatedVectorDrawable 来支持矢量图动画。
    官方文档:
    VectorDrawable,AnimatedVectorDrawable
    VectorDrawable转换Bitmap

         Bitmap bitmap;
        if (Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP){
            Drawable vectorDrawable = context.getDrawable(R.id.img_vector);
            bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            vectorDrawable.draw(canvas);
        }else {
            Drawable drawable = AppCompatDrawableManager.get().getDrawable(context, R.id.img_vector);
            bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
        }
    

    5.0以上版本使用

    Android studio在2.0的版本中可以直接使用svg
    新建一个SVGDemo项目,

    新建Vector Asset文件

    File -> New -> Vector Asset



    导入SVG

    可以选择Google提供的Material Icon进行导入也可以选择Local File选择本地svg文件进行导入,一般选择后者。对文件命名后点击Next ->Finish在drawable目录下就添加了一个.xml的文件
    点击可以进行预览,一看是不是很像selector、animation-list只是标签为vector标签 width、height为对应的宽高,可以进行设置,viewportWidth、viewportHeight这个我也不太了解大概就是视图的宽高吧,好像作用不大,没有设置过。path为html中的一个标签用来定义路径,我们只关心path标签中的android:fillColor=”#FBDC00”的属性,用来改变颜色。



    使用SVG

    在layout新建一个activity_svg.xml文件

    <ImageView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@drawable/ic_china"/>
    

    就是这样简单,预览效果图:


    也可以当背景使用

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_china">
    </LinearLayout>
    

    5.0以下版本使用SVG

    上面说了在Android5.0以上使用svg图片是没有任何问题,但是怎么兼容5.0以下的机型,很多github第三方开源库可以解决,其实google已经给出了解决方案,我们主要了解原生的解决办法。


    添加兼容性支持
    首先,你需要在项目的build.gradle脚本中,增加对Vector兼容性的支持,代码如下所示:


    android {
    defaultConfig {
    vectorDrawables.useSupportLibrary = true
    }
    }

    在defaultConfig中添加了

    vectorDrawables.useSupportLibrary = true
    

    当然还需要添加appcompat的支持

    compile 'com.android.support:appcompat-v7:23.4.0'
    

    在ImageView中使用
    1、我们要引用support:appcompat-v7中的view首先我们需要在XML布局文件头部添加:

    xmlns:app="http://schemas.android.com/apk/res-auto"
    

    2、 用V7下的AppCompatImageView代替ImageView
    3、将android:src属性,换成app:srcCompat即可
    代码如下 :

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
    
    <android.support.v7.widget.AppCompatImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_china"/>
     </LinearLayout>
    

    效果图


    这里AppCompatImageView就不做过多介绍
    官方文档
    在background使用
    根据上文是不是能推测出有app:backgroundCompat属性呢,然而并不如我们所愿,没有这样的属性。所以我们只能用 android:background这个属性了,先不管这么多了直接4.4的机器上运行试试,果然崩了,在这里说明下在普通控件上使用Vector,就必须依附于StateListDrawable,InsetDrawable,LayerDrawable,LevelListDrawable,RotateDrawable我们选择selector代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_china"/>
    </selector>
    

    这样是不是完了呢?在运行试试还是崩了,这里又是一个坑…..
    还需要在activity中添加如下代码:

    static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
    

    完美。


    iconfont的使用

    上面介绍了把svg图片导入到项目中,但是一个个的svg是不是很麻烦,而且drawable会有大量的文件,阿里妈妈就提供了iconfont,
    Iconfont-国内功能很强大且图标内容很丰富的矢量图标库,提供矢量图标下载、在线存储、格式转换等功能。
    iconfont的简单使用
    iconfont在Android中的使用官网已经做了非常详细介绍http://www.iconfont.cn/help/detail?helptype=code使用起来也很简单,我总结了几步:
    - 首先在我的项目中新建一个自己的项目;
    - 从iconfont平台选择要使用到的图标或者本地导入svg图片到项目中;
    - 下载代码,把iconfont.svg和iconfont.ttf文件导入到项目中的assets文件夹中;
    - 用TextView代替ImagerView,找到图标相对应的 HTML 实体字符码给textView设置;
    - textview设置大小跟颜色,图标的大小颜色也会改变(这里大小最好用dp为单位,这样不会随着手机字体大小的改变而改变图标的大小);
    - 为Textview设置指定的ttf文字;

     <TextView
        android:id="@+id/text_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="&#xe6dd;"
        android:textColor="@color/red"
        android:textSize="50dp"/>
    
    //为TextView设置指定ttf文字
    Typeface iconfont = Typeface.createFromAsset(getAssets(), "iconfont/iconfont.ttf");
    TextView textview = (TextView)findViewById(R.id.text_icon);
    textview.setTypeface(iconfont);
    

    运行效果图

    iconfont的封装
    每次都给TextView设置指定文字是不是也很繁琐,而且一直不断的在读取iconfont.ttf文字,也很浪费内存,我们完全可以把这个抽离出来,说干就干。
    首先我们要读取到的是assets目录下的iconfont.ttf文件;这里我把它放到自定义的Application中,这样就只要读取一次,代码如下:

    public class MyApplication extends Application {
    
    public static Typeface iconfont;
    
    ...
    
    public static Typeface getIconfont(Context context) {
        if (iconfont != null) {
            return iconfont;
        } else {
            iconfont = Typeface.createFromAsset(context.getAssets(), "iconfont/iconfont.ttf");
        }
        return iconfont;
    }
    

    这里就实例化了iconfont。然后给每TextView设置Typeface,这肯定不是我们想要的,所以我们自定义一个TextView然后初始化时setTypeface就可以了代码如下:

    public class TextViewIcon extends AppCompatTextView {
    public TextViewIcon(Context context) {
        super(context);
        init(context);
    }
    
    
    public TextViewIcon(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    
    public TextViewIcon(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }
    
    private void init(Context context) {
        setTypeface(VcApplication.getIconfont(context));
    }
    
    }
    

    就下了就可以直接在layout文件中使用了

    <com.example.svgdemo.TextViewIcon
        android:id="@+id/text_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="&#xe643;"
        android:textColor="#ff0000"
        android:textSize="50dp"/>
    

    运行效果跟上图一样。
    iconfont动态设置
    动态设置通俗的说就是在代码里动态的调整图标的大小颜色或改变图片,iconfont改变大小颜色这很简单直接调用TextView的setTextSize和setTextColor就可以了,动态设置图片是不是setText呢?

     textview.setText("&#xe643;");
    

    运行发现并不如我们所愿这里涉及到unicode 字符的问题,
    把代码稍改一下

    textview.settext("\ue643");// "&#x" 替换成 "\u",用 unicode 字符来表示
    

    这样问题就解决了


    总结

    通过这篇文章,我们基本就能掌握SVG在Android中的使用了,并且了解了阿里的iconfont的使用以及封装,其实SVG在Android中的应用还有很多列如文中提到的AnimatedVectorDrawable矢量图动画等,还有我把遇到的问题也贴出来希望大家来和我交流。怎么在Android中使用iconfont彩色图片,以及iconfont在除TextView其他控件的使用。谢谢!!!

    展开全文
  • 从AI中导出的SVG图,有时会报错:internal error parsing svg,估计是从AI导出的设置不对,AndroidStudio的解析工具并不支持所有svg的属性,报错的机会还是挺多的哈!以上这个网址很好的解决这个问题,能够快速将...

    svg转Vector xml 网址

    从AI中导出的SVG图,有时会报错:internal error parsing svg,估计是从AI导出的设置不对,AndroidStudio的解析工具并不支持所有svg的属性,报错的机会还是挺多的哈!以上这个网址很好的解决这个问题,能够快速将svg图转为vector xml文件直接Download,赋值到项目中用,非常方便。

    编辑svg网址

    美工制作的svg基本尺寸不对,我想通过AI直接导成1x、2x、3xpng图片,但是基本尺寸对不上,又不会通过AI更改尺寸,上面这个网站可以更改调整,可以处理svg的尺寸大小、颜色、图标的位置、方向等,功能非常强大。

    展开全文
  • Android SVG 绘制三角形

    2018-07-12 13:05:59
    一、首先我们来绘制一个三角形 &amp;amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&...vector xmlns:android=&...http://schemas.android.com/apk/res/android&... android
  • Android 动态修改SVG数据 这是一张svg的图 ,需求是动态修改上面的值. 1.首先用webview加载svg图 2.是需要知道 svg对应的标签 id 3.在onPageFinished后才能开始修改 wv.setWebViewClient(new WebViewClient() { @...
  • 我现在想在android上用svg文件,我们要解析svg文件,显示,能够两个手指进行缩放,能够接收到svg中每个图形元素的点击事件,我想问一下,各位大侠有知道什么好的方案或者用什么开源包能实现吗?我现在是在直接用js...
  • Android 加载SVG动画

    2017-07-17 17:37:45
    加载 SVG 动画
  • 前言:SVG格式图片很多优点,但是android程序员关心的优点无非如下: SVG较G I F、JPEG的优势 首先简要解释一下矢量图像格式和位图图像格式的区别。矢量图像用点和线来描述物体,所以文件会比较小,同时也能提供...
  • Android中使用SVG

    2018-12-06 09:27:19
    简介 可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG由W3C制定,是一个开放标准。——摘自维基百科 ...Android也...
  • AndroidSVG的使用姿势

    2017-02-17 10:18:48
    SVG是什么? - SVG 意为可缩放矢量图形(Scalable Vector Graphics), - SVG 用来定义用于网络的基于矢量的图形 - SVG 使用 XML 格式定义图形 - SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失 - ...
  • Android加载SVG实现交互式地图绘制 Android加载SVG实现交互式地图绘制效果图 实现思路 准备工作 具体实现 效果图实现思路 下载SVG文件 将svg资源转换成相应的java代码 解析svg/xml文件 自定义MapView 重写...
  • Androidsvg实现的svg动画效果(超简单,在Android中除svg路径动画外,svg已经兼容到3.0以下,源代码已上传github) 什么是SVG svg概念 SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的...
  • (2)Android实现炫酷SVG动画效果 原文出处:http://blog.csdn.net/crazy__chen/article/details/47728241  svg是目前十分流行的图像文件格式了,svg严格来说应该是一种开放标准的矢量图形语言,...
  • SVG矢量图形打造不规则的自定义控件-手写中国地图 技术点:svg技术起源详解 svg解决复杂控件与动画的解决之路 在不规则的控件中如何判断事件边界 ?? svg实现控件自动缩放 svg 概念 :矢量图形 SVG 指可伸缩矢量图形 ...
  • Android SVG使用进阶

    2017-09-26 16:02:11
    今日科技快讯 ...近日,苹果开始严格执行限制热更新政策,数据显示截止到6月16日,中国地区下架应用已经接近3万,包括《天天酷跑》等游戏,其中6月15日一天,最高下架应用超过2万,游戏类应用超1万...
  • SVG矢量图相比于PNG等位图,一个非常大的优点就是可以方便快速地修改图片颜色,...IconFont也具体了这一优点,可以通过textColor修改图片颜色,当然SVG-Android库也同样实现了这一功能,可以非常方便地设置图片颜色
1 2 3 4 5 ... 20
收藏数 5,085
精华内容 2,034