├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── cn │ │ └── refactor │ │ └── wavylineview │ │ └── MainActivity.java │ └── res │ ├── layout │ └── activity_main.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 │ ├── values-v21 │ └── styles.xml │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── art └── wavyline.gif ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── cn │ │ └── refactor │ │ └── library │ │ └── WavyLineView.java │ └── res │ └── values │ ├── attrs.xml │ └── strings.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | *.DS_Store 3 | 4 | # Gradle files 5 | build/ 6 | .gradle/ 7 | */build/ 8 | 9 | # IDEA 10 | *.iml 11 | .idea/ 12 | 13 | # Built application files 14 | *.apk 15 | *.ap_ 16 | 17 | # Files for the Dalvik VM 18 | *.dex 19 | 20 | # Java class files 21 | *.class 22 | 23 | # Local configuration file (sdk path, etc) 24 | local.properties 25 | 26 | # Log Files 27 | *.log -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WavyLineView 2 | 3 | A custom wavy line view for android. 4 | 5 | ![](https://github.com/andyxialm/WavyLineView/blob/master/art/wavyline.gif?raw=true) 6 | 7 | ### Sample 8 | [Download Demo APK](http://fir.im/rgum) 9 | 10 | ### Features 11 | + Custom attr 12 | 13 | ### Usage 14 | 15 | ##### Edit your layout XML: 16 | 17 | ~~~ xml 18 | 22 | ~~~ 23 | 24 | 25 | 26 | ### License 27 | 28 | Copyright 2016 andy 29 | 30 | Licensed under the Apache License, Version 2.0 (the "License"); 31 | you may not use this file except in compliance with the License. 32 | You may obtain a copy of the License at 33 | 34 | http://www.apache.org/licenses/LICENSE-2.0 35 | 36 | Unless required by applicable law or agreed to in writing, software 37 | distributed under the License is distributed on an "AS IS" BASIS, 38 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 39 | See the License for the specific language governing permissions and 40 | limitations under the License. 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | *.iml -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "cn.refactor.wavylineview" 9 | minSdkVersion 14 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.android.support:appcompat-v7:23.2.0' 26 | compile 'com.android.support:design:23.2.0' 27 | compile project(':library') 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/andy/Library/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/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/cn/refactor/wavylineview/MainActivity.java: -------------------------------------------------------------------------------- 1 | package cn.refactor.wavylineview; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.widget.SeekBar; 7 | 8 | import cn.refactor.library.WavyLineView; 9 | 10 | 11 | public class MainActivity extends AppCompatActivity { 12 | 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | setContentView(R.layout.activity_main); 17 | 18 | setupViews(); 19 | } 20 | 21 | private void setupViews() { 22 | 23 | final WavyLineView wavyLineView = (WavyLineView) findViewById(R.id.wavyLineView); 24 | float initPeriod = (float) (2 * Math.PI / 180); 25 | int initAmplitude = 25; 26 | int initStrokeWidth = 2; 27 | wavyLineView.setPeriod(initPeriod); 28 | wavyLineView.setAmplitude(initAmplitude); 29 | wavyLineView.setColor(getResources().getColor(R.color.colorAccent)); 30 | wavyLineView.setStrokeWidth(dp2px(this, initStrokeWidth)); 31 | 32 | SeekBar amplitudeSb = (SeekBar) findViewById(R.id.sb_amplitude); 33 | amplitudeSb.setMax(100); 34 | amplitudeSb.setProgress(initAmplitude); 35 | amplitudeSb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 36 | @Override 37 | public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 38 | wavyLineView.setAmplitude(progress); 39 | } 40 | 41 | @Override 42 | public void onStartTrackingTouch(SeekBar seekBar) { 43 | 44 | } 45 | 46 | @Override 47 | public void onStopTrackingTouch(SeekBar seekBar) { 48 | 49 | } 50 | }); 51 | 52 | SeekBar periodSb = (SeekBar) findViewById(R.id.sb_period); 53 | periodSb.setMax(720); 54 | periodSb.setProgress((int) (2 * Math.PI / initPeriod)); 55 | periodSb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 56 | @Override 57 | public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 58 | wavyLineView.setPeriod((float) (2 * Math.PI / progress)); 59 | } 60 | 61 | @Override 62 | public void onStartTrackingTouch(SeekBar seekBar) { 63 | 64 | } 65 | 66 | @Override 67 | public void onStopTrackingTouch(SeekBar seekBar) { 68 | 69 | } 70 | }); 71 | 72 | SeekBar widthSb = (SeekBar) findViewById(R.id.sb_width); 73 | widthSb.setMax(15); 74 | widthSb.setProgress(dp2px(this, initStrokeWidth)); 75 | widthSb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 76 | @Override 77 | public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 78 | wavyLineView.setStrokeWidth(progress); 79 | } 80 | 81 | @Override 82 | public void onStartTrackingTouch(SeekBar seekBar) { 83 | 84 | } 85 | 86 | @Override 87 | public void onStopTrackingTouch(SeekBar seekBar) { 88 | 89 | } 90 | }); 91 | } 92 | 93 | public static int dp2px(Context context, float dipValue) { 94 | final float scale = context.getResources().getDisplayMetrics().density; 95 | return (int) (dipValue * scale + 0.5f); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 17 | 18 | 19 | 26 | 27 | 31 | 32 | 36 | 37 | 38 | 45 | 46 | 50 | 51 | 55 | 56 | 57 | 64 | 65 | 69 | 70 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyxialm/WavyLineView/f21c81c80e02511fe3071616821dd39c7c895ef7/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyxialm/WavyLineView/f21c81c80e02511fe3071616821dd39c7c895ef7/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyxialm/WavyLineView/f21c81c80e02511fe3071616821dd39c7c895ef7/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyxialm/WavyLineView/f21c81c80e02511fe3071616821dd39c7c895ef7/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyxialm/WavyLineView/f21c81c80e02511fe3071616821dd39c7c895ef7/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | > 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | WavyLineView 3 | Stroke Width 4 | Amplitude 5 | Period 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 |