Skip to content
This repository has been archived by the owner on Feb 8, 2022. It is now read-only.

v1.0.3 (AndroidStudio 3) #9

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ android {
applicationId "com.github.florent37.topnav"
versionCode 1
versionName "1.0"
//below will fix "Can't process attribute android:fillColor="@color"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
Expand All @@ -20,12 +22,13 @@ android {
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile project(":bubbletab")
//compile 'com.github.florent37:bubbletab:1.0.0'
compile 'com.android.support:appcompat-v7:'+project.supportVersion
compile 'com.android.support:cardview-v7:'+project.supportVersion
compile 'com.android.support:recyclerview-v7:'+project.supportVersion
compile 'com.jakewharton:butterknife:7.0.1'
api fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
api project(":bubbletab")
//api 'com.github.florent37:bubbletab:1.0.0'
api 'com.android.support:appcompat-v7:'+project.supportVersion
api 'com.android.support:cardview-v7:'+project.supportVersion
api 'com.android.support:recyclerview-v7:'+project.supportVersion
api 'com.jakewharton:butterknife:7.0.1'
annotationProcessor 'com.jakewharton:butterknife:7.0.1'
}
10 changes: 7 additions & 3 deletions bubbletab/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ android {
targetSdkVersion project.sdk
versionCode 1
versionName "1.0"
//below will fix "Can't process attribute android:fillColor="@color"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
Expand All @@ -19,9 +21,11 @@ android {
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:'+project.supportVersion
api fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
api 'com.android.support:appcompat-v7:'+project.supportVersion

api 'com.android.support:support-annotations:'+project.supportVersion
}

version = project.libraryVersion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,36 +24,24 @@ public class BubbleTab extends LinearLayout {
int numberOfIcons = 0;
@Nullable
ViewPager viewPager;
int tabWidth;

private Circle circle = new Circle();
private Setting setting;
private List<View> icons;
private final ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {

private final ChangeListener pageChangeListener = new ChangeListener();
private final class ChangeListener implements ViewPager.OnPageChangeListener {
float oldPositionOffset;
boolean toRight;

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//Log.d("percent", "" + positionOffset);
//Log.d("onPageScrolled", position + " : " + positionOffset);

if (oldPositionOffset == 0) {
toRight = positionOffset > oldPositionOffset;
}
if (tabWidth == 0 && numberOfIcons != 0) {
tabWidth = getWidth() / numberOfIcons;

circle.setWidth(tabWidth);
}

float x = position * tabWidth + tabWidth * positionOffset;
circle.setTranslationX(x);

float distanceFromMiddle = Math.abs(positionOffset - 0.5f);
float min = 0f;
float scale = min + (1 - min) * (distanceFromMiddle + 0.5f);

circle.setScale(scale);
circle.layout(BubbleTab.this, position, positionOffset);

if (positionOffset != 0) {
if (toRight) {
Expand Down Expand Up @@ -114,19 +102,31 @@ public BubbleTab(Context context, AttributeSet attrs, int defStyleAttr) {
}

public void setupWithViewPager(final ViewPager viewPager) {
this.viewPager = viewPager;
if(this.viewPager != null)
this.viewPager.removeOnPageChangeListener(pageChangeListener);

viewPager.addOnPageChangeListener(pageChangeListener);
this.viewPager = viewPager;
this.viewPager.addOnPageChangeListener(pageChangeListener);

final int currentItem = viewPager.getCurrentItem();
for (int i = 0; i < icons.size(); i++) {
icons.get(i).setSelected(i == currentItem);
}

circle.setTranslationX(tabWidth * currentItem);
//no need to update here since we override "onLayout(...)"
// but still we want to support change of pager more then ones
circle.layout(this, this.viewPager);
postInvalidate();
}

@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (viewPager != null) {
viewPager.addOnPageChangeListener(pageChangeListener);
postInvalidate();
}
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Expand Down Expand Up @@ -157,7 +157,6 @@ public void onClick(View v) {
}
});
}

}

protected float dpToPx(int dp) {
Expand All @@ -169,13 +168,21 @@ private void init(Context context, AttributeSet attrs) {
setting = new Setting(context, attrs);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
//prepare shape even before any "onPageScrolled(...)" event
circle.layout(this, viewPager);
}

@Override
protected void onDraw(Canvas canvas) {
circle.onDraw(canvas);
super.onDraw(canvas);
}

private static class Circle {
public float lastOffset = 0f; //current shape-offset in percentage (from 0f to 1f)

private Paint paint = new Paint();

Expand Down Expand Up @@ -222,6 +229,46 @@ public void setRatio(float circleRatio) {
public void setScale(float scale) {
this.scale = scale;
}


static int valueForFrame(int valueStart, int valueEnd, float frameStart, float frames, float currentFrame) {
return (int)( (valueEnd-valueStart)/frames * (currentFrame-frameStart) + valueStart );
}

public void layout(BubbleTab owner, int position, float positionOffset) {
int widthStart = 0; int widthEnd;
View c = owner.getChildAt(position);
if(c != null) {
widthStart = c.getWidth();
//animate to next tabs size and reverse
View next = owner.getChildAt(position+1);
if(next != null) {
widthEnd = valueForFrame(widthStart, next.getWidth(), 0f, 1f, positionOffset);
} else {
widthEnd = widthStart;
}
this.setWidth(widthEnd);
}

float x = c.getX() + widthStart * positionOffset;
this.setTranslationX(x);

float distanceFromMiddle = Math.abs(positionOffset - 0.5f);
float min = 0f;
float scale = min + (1 - min) * (distanceFromMiddle + 0.5f);

this.setScale(scale);
lastOffset = positionOffset;
}
//prepare shape based on "ViewPager" position
public void layout(BubbleTab owner, ViewPager viewPager) {
//get current Page-index
int position = viewPager != null ? viewPager.getCurrentItem() : 0;
//convert Page-index to position (position is always less than current Page-index)
if(position > 1)
position -= 1;
this.layout(owner, position, this.lastOffset);
}
}

static class Setting {
Expand Down
27 changes: 20 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
ext {
offline = 'D:/android/sdk/extras/m2repository'
}
repositories {
jcenter()
maven { url 'https://maven.google.com' }
try { maven { url uri('C:/Program Files/Android/Android Studio/gradle/m2repository') } } catch (Throwable e) {}
try { maven { url uri(offline) } } catch (Throwable e) {}

jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.1'
classpath 'com.android.tools.build:gradle:3.1.3'

classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
Expand All @@ -21,17 +30,21 @@ buildscript {

ext {
sdk = 26
buildTools = "26.0.2"
buildTools = "28.0.1"
minSdk = 15
libraryVersion = "1.0.2"
supportVersion = "26.1.0"
supportVersion = "25.3.1"
}

allprojects {
repositories {
jcenter()
maven { url 'https://maven.google.com' }
try { maven { url uri(offline) } } catch (Throwable e) {}

jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
}

Expand Down
7 changes: 6 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,9 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
#distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
#distributionUrl=file\:///D\:/android/gradle/gradle-4.4-all.zip

#org.gradle.jvmargs=-Xmx1536M