咱們知道4.4之後AnimatedVectorDrawable可讓兩個SVG圖像無縫過渡 (稱爲變形動畫),可是這兩個svg圖像的path必須參數個數要相等,同時這些參數的類型要匹配(也就是說格式要對齊),若是不對齊會產生異常。簡單的 path能夠手動修改對齊,可是複雜點的就比較難了。這個工具就是經過命令行的方式將任意兩個svg資源轉換成對齊的模式,而不會改變原始圖像的外觀。html
完整源碼地址:http://www.itlanbao.com/code/20150909/10000/100516.html
package org.bonnyfone.vectalignsamples;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.wnafee.vector.MorphButton;
public class ActivityMainActivity extends AppCompatActivity {
private ViewGroup parent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity_main);
parent = (ViewGroup) findViewById(R.id.base_view);
//Default image
handleMenu(R.id.action_droid_to_apple);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
handleMenu(item.getItemId());
return true;
}
private void handleMenu(int id){
switch (id){
case R.id.action_github:
final String url = "https://github.com/bonnyfone/vectalign";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
break;
case R.id.action_droid_to_apple:
swapView(createMorphableView(R.drawable.animated_vector_droid_for_apple, R.drawable.animated_vector_apple, Color.parseColor("#4CAF50")));
break;
case R.id.action_heart:
swapView(createMorphableView(R.drawable.animated_vector_twitter, R.drawable.animated_vector_heart, Color.parseColor("#039BE5")));
break;
case R.id.action_cart_to_droid:
swapView(createMorphableView(R.drawable.animated_vector_cart, R.drawable.animated_vector_droid_for_cart, Color.parseColor("#FF5252")));
break;
case R.id.action_icons:
swapView(createMorphableView(R.drawable.animated_vector_icon_a, R.drawable.animated_vector_icon_b, Color.parseColor("#311B92")));
break;
case R.id.action_wifi_to_retwwet:
swapView(createMorphableView(R.drawable.animated_vector_wifi, R.drawable.animated_vector_retweet, Color.parseColor("#607D8B")));
break;
}
}
private void swapView(View newView){
View toRemove = parent.findViewById(R.id.morph_id);
parent.removeView(toRemove);
newView.setId(R.id.morph_id);
parent.addView(newView, toRemove.getLayoutParams());
}
private View createMorphableView(int startDrawable, int endDrawable, int color){
MorphButton mb = new MorphButton(this);
mb.setForegroundTintList(ColorStateList.valueOf(color));
mb.setForegroundTintMode(PorterDuff.Mode.MULTIPLY);
mb.setBackgroundColor(Color.TRANSPARENT);
mb.setStartDrawable(startDrawable);
mb.setEndDrawable(endDrawable);
mb.setState(MorphButton.MorphState.START);
return mb;
}
}android