android - 更改 SVG 图像中每个元素的颜色

标签 android svg colors

我有一个 Android SVG 图片。我想根据给定的输入更改不同部位的颜色,例如头部、右臂和左臂、眼睛和 body 。

例如,当输入为“<=30”时,SVG 图像的任何部分都应变为红色。如果输入为“<=60”,则 SVG 图像的任何部分都应变为黑色。当输入为“>60”时,SVG 图像的任何部分都应变为洋红色。我将 SVG 图像以 XML 格式保存在“Drawable/android_pic”下。那么如何更改 SVG 图像中不同部分/元素的颜色呢?

问题是,我无法更改 SVG 图像不同部分的颜色。
这是我的编码。

 public class MainActivity extends Activity {

        EditText et,et2,et3;
        ImageView img1,img2,img3;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            final ImageView img1 = (ImageView) findViewById(R.id.android1);//change color of android logo
            final ImageView img2 = (ImageView) findViewById(R.id.arms);//change color of arms
            final ImageView img3 = (ImageView) findViewById(R.id.head_eyes);//change color of head and eyes parts


            final EditText et = (EditText) findViewById(R.id.editText);
            final EditText et2 = (EditText) findViewById(R.id.editText2);
            final EditText et3 = (EditText) findViewById(R.id.editText3);

            et.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
            et.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void afterTextChanged(Editable s) {

                    int i = Integer.parseInt(s.toString());
                    if (i <= 30) {
                        //img1.setBackgroundColor(Color.BLUE);
                        img1.getDrawable().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
                    } else if (i <= 60) {
                        img1.getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);

                    } else if (i > 60) {

                        img1.getDrawable().setColorFilter(Color.MAGENTA, PorterDuff.Mode.MULTIPLY);
                    }
                }
            });

            //change color of arms
            et2.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
            et2.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void afterTextChanged(Editable s) {

                    int i = Integer.parseInt(s.toString());
                    if (i <= 30)
                    {
                        img2.getDrawable().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
                    }
                    else if (i <= 60)
                    {
                        img2.getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
                       }
                    else if (i > 60) {

                        img2.getDrawable().setColorFilter(Color.MAGENTA, PorterDuff.Mode.MULTIPLY);

                    }
                }
            });

                    //change color of head and eyes parts

            et3.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
            et3.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void afterTextChanged(Editable s) {

                    int i = Integer.parseInt(s.toString());
                    if (i <= 30)
                    {
                        img3.getDrawable().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
                    }
                    else if (i <= 60)
                    {
                        img3.getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
                    }
                    else if (i > 60) {

                        img3.getDrawable().setColorFilter(Color.MAGENTA, PorterDuff.Mode.MULTIPLY);

                    }
                }
            });


        }
        }`

我把图片保存为XML格式,这里是Android图片的XML编码。

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:viewportWidth="500"
    android:viewportHeight="500"
    android:width="500px"
    android:height="500px">

    <group android:name="android1">
        <group android:name="head_eyes">
            <path
                android:name="head"
                android:fillColor="#9FBF3B"
                android:pathData="M301.314,83.298l20.159-29.272c1.197-1.74,0.899-4.024-0.666-5.104c-1.563-1.074-3.805-0.543-4.993,1.199L294.863,80.53c-13.807-5.439-29.139-8.47-45.299-8.47c-16.16,0-31.496,3.028-45.302,8.47l-20.948-30.41c-1.201-1.74-3.439-2.273-5.003-1.199c-1.564,1.077-1.861,3.362-0.664,5.104l20.166,29.272c-32.063,14.916-54.548,43.26-57.413,76.34h218.316C355.861,126.557,333.375,98.214,301.314,83.298" />
            <path
                android:name="left_eye"
                android:fillColor="#FFFFFF"
                android:pathData="M203.956,129.438c-6.673,0-12.08-5.407-12.08-12.079c0-6.671,5.404-12.08,12.08-12.08c6.668,0,12.073,5.407,12.073,12.08C216.03,124.03,210.624,129.438,203.956,129.438" />
            <path
                android:name="right_eye"
                android:fillColor="#FFFFFF"
                android:pathData="M295.161,129.438c-6.668,0-12.074-5.407-12.074-12.079c0-6.673,5.406-12.08,12.074-12.08c6.675,0,12.079,5.409,12.079,12.08C307.24,124.03,301.834,129.438,295.161,129.438" />
        </group>
        <group android:name="arms">
            <path
                android:name="left_arm"
                android:fillColor="#9FBF3B"
                android:pathData="M126.383,297.598c0,13.45-10.904,24.354-24.355,24.354l0,0c-13.45,0-24.354-10.904-24.354-24.354V199.09c0-13.45,10.904-24.354,24.354-24.354l0,0c13.451,0,24.355,10.904,24.355,24.354V297.598z" />
            <path
                android:name="right_arm"
                android:fillColor="#9FBF3B"
                android:pathData="M372.734,297.598c0,13.45,10.903,24.354,24.354,24.354l0,0c13.45,0,24.354-10.904,24.354-24.354V199.09c0-13.45-10.904-24.354-24.354-24.354l0,0c-13.451,0-24.354,10.904-24.354,24.354V297.598z" />
        </group>
        <path
            android:name="body"
            android:fillColor="#9FBF3B"
            android:pathData="M140.396,175.489v177.915c0,10.566,8.566,19.133,19.135,19.133h22.633v54.744c0,13.451,10.903,24.354,24.354,24.354c13.451,0,24.355-10.903,24.355-24.354v-54.744h37.371v54.744c0,13.451,10.902,24.354,24.354,24.354s24.354-10.903,24.354-24.354v-54.744h22.633c10.569,0,19.137-8.562,19.137-19.133V175.489H140.396z" />
    </group>
</vector>

`

最佳答案

你可以做你想做的事。点击链接 https://medium.com/@emmaguy/dynamically-changing-svg-colours-on-android-b026a99137ad#.7m1nxdfcb .如前所述,创建具有不同颜色的主题并更改主题

    final ContextThemeWrapper wrapper1 = new ContextThemeWrapper(this, R.style.Theme1);
    final Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.analytics, wrapper1.getTheme());
    ImageView imageView = (ImageView) findViewById(R.id.my_image);
    imageView.setImageDrawable(drawable);

关于android - 更改 SVG 图像中每个元素的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30310450/

相关文章:

java - 机器人。在测试套件中,每个下一个测试都受到前一个测试的影响

android - 在android中以编程方式覆盖Text-To-Speech设置中的 "Always use my settings"选项

css - 修复了 SVG clippingPath

css - 复杂 SVG 中的外部阴影 [jVectorMap Countries]

html - 背景 CSS 和 Google Chrome

Android Studio 4.1 ADB 服务器问题

android - 尝试在 Android WebView 中打开 SELECT 标记会使应用程序崩溃

css - SVG 线条动画在 Safari 中反转?

c++ - 检测显示器上的 10 位颜色支持

java - JList文本颜色