├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── markdown-navigator │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── clwang │ │ └── chunyu │ │ └── me │ │ └── testsvg │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── clwang │ │ │ └── chunyu │ │ │ └── me │ │ │ └── testsvg │ │ │ ├── AnimationActivity.java │ │ │ ├── ImageActivity.java │ │ │ ├── MainActivity.java │ │ │ └── OtherActivity.java │ └── res │ │ ├── animator │ │ └── heart_animator.xml │ │ ├── drawable-v21 │ │ └── v_heard_animation.xml │ │ ├── drawable │ │ ├── ic_android_black_24dp.xml │ │ ├── v_heard.xml │ │ ├── v_homer_simpson.xml │ │ └── v_homer_simpson_online.xml │ │ ├── layout │ │ ├── activity_animation.xml │ │ ├── activity_image.xml │ │ ├── activity_main.xml │ │ └── activity_other.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── raw │ │ └── cartman.svg │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── clwang │ └── chunyu │ └── me │ └── testsvg │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | TestSVG -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 26 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | Android 46 | 47 | 48 | Android Lint 49 | 50 | 51 | Java 52 | 53 | 54 | Java language level migration aidsJava 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 76 | 77 | $USER_HOME$/.subversion 78 | 79 | 80 | 81 | 82 | 83 | 1.8 84 | 85 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TestSVG 2 | 3 | SVG 图像技术的基础教程 4 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion '25.0.0' 6 | 7 | defaultConfig { 8 | applicationId "clwang.chunyu.me.testsvg" 9 | minSdkVersion 17 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.pixplicity.sharp:library:1.1.0@aar' 26 | compile 'com.android.support:appcompat-v7:23.2.0' 27 | compile 'com.jakewharton:butterknife:7.0.1' 28 | } 29 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/wangchenlong/Installations/android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/clwang/chunyu/me/testsvg/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package clwang.chunyu.me.testsvg; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/clwang/chunyu/me/testsvg/AnimationActivity.java: -------------------------------------------------------------------------------- 1 | package clwang.chunyu.me.testsvg; 2 | 3 | import android.graphics.drawable.AnimatedVectorDrawable; 4 | import android.os.Build; 5 | import android.os.Bundle; 6 | import android.support.v4.content.ContextCompat; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.view.View; 9 | import android.widget.Button; 10 | import android.widget.ImageView; 11 | 12 | import butterknife.Bind; 13 | import butterknife.ButterKnife; 14 | 15 | /** 16 | * SVG动画 17 | */ 18 | public class AnimationActivity extends AppCompatActivity { 19 | 20 | @Bind(R.id.main_iv_image_view) ImageView mIvImageView; 21 | @Bind(R.id.main_b_draw) Button mBDraw; 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_animation); 27 | ButterKnife.bind(this); 28 | 29 | animateImage(); // 动画播放图片 30 | 31 | // 重绘动画 32 | mBDraw.setOnClickListener(new View.OnClickListener() { 33 | @Override public void onClick(View v) { 34 | animateImage(); 35 | } 36 | }); 37 | } 38 | 39 | // 只支持5.0以上. 40 | private void animateImage() { 41 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 42 | // 获取动画效果 43 | AnimatedVectorDrawable mAnimatedVectorDrawable = (AnimatedVectorDrawable) 44 | ContextCompat.getDrawable(getApplication(), R.drawable.v_heard_animation); 45 | mIvImageView.setImageDrawable(mAnimatedVectorDrawable); 46 | if (mAnimatedVectorDrawable != null) { 47 | mAnimatedVectorDrawable.start(); 48 | } 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/clwang/chunyu/me/testsvg/ImageActivity.java: -------------------------------------------------------------------------------- 1 | package clwang.chunyu.me.testsvg; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.app.AppCompatActivity; 6 | 7 | /** 8 | * SVG图片 9 | *

10 | * Created by wangchenlong on 16/3/6. 11 | */ 12 | public class ImageActivity extends AppCompatActivity { 13 | @Override protected void onCreate(@Nullable Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.activity_image); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/clwang/chunyu/me/testsvg/MainActivity.java: -------------------------------------------------------------------------------- 1 | package clwang.chunyu.me.testsvg; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.Button; 9 | 10 | import butterknife.Bind; 11 | import butterknife.ButterKnife; 12 | 13 | /** 14 | * 跳转三个模块: SVG图片, SVG动画, Sharp库 15 | *

16 | * Created by wangchenlong on 16/3/6. 17 | */ 18 | public class MainActivity extends AppCompatActivity { 19 | 20 | @Bind(R.id.main_b_image) Button mBImage; 21 | @Bind(R.id.main_b_animation) Button mBAnimation; 22 | @Bind(R.id.main_b_sharp) Button mBSharp; 23 | 24 | @Override protected void onCreate(@Nullable Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_main); 27 | ButterKnife.bind(this); 28 | 29 | // 图像 30 | mBImage.setOnClickListener(new View.OnClickListener() { 31 | @Override public void onClick(View v) { 32 | startActivity(new Intent(MainActivity.this, ImageActivity.class)); 33 | } 34 | }); 35 | 36 | // 动画 37 | mBAnimation.setOnClickListener(new View.OnClickListener() { 38 | @Override public void onClick(View v) { 39 | startActivity(new Intent(MainActivity.this, AnimationActivity.class)); 40 | } 41 | }); 42 | 43 | // 第三方库 44 | mBSharp.setOnClickListener(new View.OnClickListener() { 45 | @Override public void onClick(View v) { 46 | startActivity(new Intent(MainActivity.this, OtherActivity.class)); 47 | } 48 | }); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/clwang/chunyu/me/testsvg/OtherActivity.java: -------------------------------------------------------------------------------- 1 | package clwang.chunyu.me.testsvg; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.Color; 5 | import android.graphics.Paint; 6 | import android.graphics.RectF; 7 | import android.graphics.drawable.Drawable; 8 | import android.os.Bundle; 9 | import android.support.annotation.NonNull; 10 | import android.support.annotation.Nullable; 11 | import android.support.v7.app.AppCompatActivity; 12 | import android.view.View; 13 | import android.widget.Button; 14 | import android.widget.ImageView; 15 | 16 | import com.pixplicity.sharp.OnSvgElementListener; 17 | import com.pixplicity.sharp.Sharp; 18 | import com.pixplicity.sharp.SharpPicture; 19 | 20 | import java.util.Random; 21 | 22 | import butterknife.Bind; 23 | import butterknife.ButterKnife; 24 | 25 | /** 26 | * 第三方库, 直接使用SVG, 不用转换Vector 27 | *

28 | * Created by wangchenlong on 16/3/7. 29 | */ 30 | public class OtherActivity extends AppCompatActivity { 31 | @Bind(R.id.other_iv_image) ImageView mIvImage; 32 | @Bind(R.id.other_b_change) Button mBChange; 33 | 34 | private Sharp mSharp; // SVG的管理类 35 | 36 | @Override protected void onCreate(@Nullable Bundle savedInstanceState) { 37 | super.onCreate(savedInstanceState); 38 | setContentView(R.layout.activity_other); 39 | ButterKnife.bind(this); 40 | // 加载南方公园的卡通人物 41 | mSharp = Sharp.loadResource(getResources(), R.raw.cartman); 42 | mSharp.into(mIvImage); 43 | 44 | // 切换SVG的颜色 45 | mBChange.setOnClickListener(new View.OnClickListener() { 46 | @Override public void onClick(View v) { 47 | changeSVG(); // 修改SVG的图片 48 | } 49 | }); 50 | } 51 | 52 | private void changeSVG() { 53 | // 切换图片的颜色 54 | mSharp.setOnElementListener(new OnSvgElementListener() { 55 | @Override 56 | public void onSvgStart(@NonNull Canvas canvas, @Nullable RectF rectF) { 57 | } 58 | 59 | @Override public void onSvgEnd(@NonNull Canvas canvas, @Nullable RectF rectF) { 60 | } 61 | 62 | @Override public T onSvgElement( 63 | @Nullable String id, @NonNull T element, @Nullable RectF elementBounds, 64 | @NonNull Canvas canvas, @Nullable RectF canvasBounds, @Nullable Paint paint) { 65 | // 变换颜色 66 | if (("shirt".equals(id) || "hat".equals(id) || "pants".equals(id))) { 67 | Random random = new Random(); 68 | if (paint != null) { 69 | paint.setColor(Color.argb(255, 70 | random.nextInt(256), random.nextInt(256), random.nextInt(256))); 71 | } 72 | } 73 | return element; 74 | } 75 | 76 | @Override 77 | public void onSvgElementDrawn(@Nullable String s, @NonNull T t, 78 | @NonNull Canvas canvas, @Nullable Paint paint) { 79 | } 80 | }); 81 | 82 | mSharp.into(mIvImage); 83 | 84 | // 设置按钮的图标 85 | mSharp.getSharpPicture(new Sharp.PictureCallback() { 86 | @Override public void onPictureReady(SharpPicture sharpPicture) { 87 | int size = getResources().getDimensionPixelSize(R.dimen.icon_size); 88 | Drawable drawable = sharpPicture.createDrawable(mBChange, size); 89 | mBChange.setCompoundDrawables(drawable, null, null, null); // 设置左侧图像 90 | } 91 | }); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /app/src/main/res/animator/heart_animator.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/v_heard_animation.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 11 | 14 | 17 | 20 | 23 | 26 | 29 | 32 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_android_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/v_heard.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 14 | 21 | 22 | 29 | 36 | 43 | 50 | 57 | 64 | 71 | 78 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/v_homer_simpson.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 | 33 | 36 | 39 | 42 | 45 | 48 | 51 | 54 | 57 | 60 | 63 | 66 | 69 | 72 | 75 | 78 | 81 | 84 | 87 | 90 | 93 | 99 | 106 | 113 | 120 | 123 | 129 | 135 | 136 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/v_homer_simpson_online.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 254 | 260 | 274 | 280 | 294 | 298 | 303 | 321 | 327 | 337 | 342 | 347 | 365 | 371 | 383 | 390 | 395 | 428 | 436 | 441 | 464 | 468 | 475 | 480 | 487 | 491 | 496 | 501 | 506 | 514 | 520 | 526 | 532 | 541 | 547 | 553 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_animation.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 |