Самый простой способ решить эту проблему, если вы хотите изменить второстепенные вещи, такие как заливка / цвет обводки или ширина обводки во время выполнения, - это две версии с одним и тем же векторным изображением с этими различиями, например, одна из них имееттолько цвет обводки, а другой заполнен:
ic_heart_stroked.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"
android:strokeWidth="1"
android:strokeColor="#000" />
</vector>
ic_heart_filled.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
</vector>
Затем в вашем коде переключайтесь между двумя файламикогда пользователь нажимает:
ibWhishlist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ibWhishlist.setImageResource(R.drawable.ic_heart_filled);
}
});
Другой способ - использовать одну из готовых библиотек. RichPathAnimator одна из лучших библиотек, она поддерживает изменение цвета векторов, ширину обводки и даже анимацию векторной графики во время выполнения.
Как ее использовать? Во-первых,добавьте библиотечную зависимость в ваше приложение build.gradle. Затем в вашем vector.xml
дайте имя пути, который вы хотите изменить, так:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:name="heartPath1"
android:fillColor="#00000000"
android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"
android:strokeWidth="1"
android:strokeColor="#000" />
</vector>
В вашем макете замените Imagebutton
на com.richpath.RichPathView
и внутри атрибута vector передайте ваш векторный ресурс в этомtag:
<com.richpath.RichPathView
android:id="@+id/heartView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:vector="@drawable/ic_heart" />
В вашем Activity
получите ссылку на richpathview
, затем позвоните findRichPathByName(YOUR_PATH_NAME)
RichPathView heartView = findViewById(R.id.heartView);
//Providing the path name that you add to your vector,
//in our example it's 'heartPath1'.
RichPath path= heartView.findRichPathByName("heartPath1");
//Set on heart path click listener.
path.setOnPathClickListener(new RichPath.OnPathClickListener() {
@Override
public void onClick(RichPath richPath) {
//Change the path color.
richPath.setFillColor(Color.RED);
//Change stroke width to zero.
richPath.setStrokeWidth(0);
}
});
Если не хотите использовать RichPathView
вместоваш ImageView
или ImageButton
, и вы хотите изменить какие-то вещи в вашем векторном пути, затем рассмотрите возможность использования VectorChildFinder .