Animate buttons

This commit is contained in:
stom79 2018-12-03 19:19:36 +01:00
parent 769f7b49de
commit 91a286a8e0
6 changed files with 157 additions and 68 deletions

View File

@ -76,7 +76,7 @@ dependencies {
implementation 'com.vanniktech:emoji-one:0.6.0-SNAPSHOT' implementation 'com.vanniktech:emoji-one:0.6.0-SNAPSHOT'
implementation 'com.oguzdev:CircularFloatingActionMenu:1.0.2' implementation 'com.oguzdev:CircularFloatingActionMenu:1.0.2'
implementation 'com.github.franmontiel:LocaleChanger:0.9.2' implementation 'com.github.franmontiel:LocaleChanger:0.9.2'
implementation 'com.github.stom79:SparkButton:1.0.8' implementation 'com.github.stom79:SparkButton:1.0.9'
implementation 'com.github.GrenderG:Toasty:1.3.0' implementation 'com.github.GrenderG:Toasty:1.3.0'
playstoreImplementation "io.github.kobakei:ratethisapp:$ratethisappLibraryVersion" playstoreImplementation "io.github.kobakei:ratethisapp:$ratethisappLibraryVersion"
} }

View File

@ -126,6 +126,7 @@ public class Status implements Parcelable{
private List<String> conversationProfilePicture; private List<String> conversationProfilePicture;
private String webviewURL = null; private String webviewURL = null;
private boolean isBoostAnimated = false, isFavAnimated = false;
protected Status(Parcel in) { protected Status(Parcel in) {
id = in.readString(); id = in.readString();
uri = in.readString(); uri = in.readString();
@ -1167,4 +1168,20 @@ public class Status implements Parcelable{
public void setNumberLines(int numberLines) { public void setNumberLines(int numberLines) {
this.numberLines = numberLines; this.numberLines = numberLines;
} }
public boolean isBoostAnimated() {
return isBoostAnimated;
}
public void setBoostAnimated(boolean boostAnimated) {
isBoostAnimated = boostAnimated;
}
public boolean isFavAnimated() {
return isFavAnimated;
}
public void setFavAnimated(boolean favAnimated) {
isFavAnimated = favAnimated;
}
} }

View File

@ -42,7 +42,6 @@ import android.text.SpannableString;
import android.text.Spanned; import android.text.Spanned;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan; import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
@ -301,7 +300,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
ImageView webview_preview_card; ImageView webview_preview_card;
LinearLayout left_buttons; LinearLayout left_buttons;
Button status_show_more_content; Button status_show_more_content;
SparkButton spark_button_fav; SparkButton spark_button_fav, spark_button_reblog;
public View getView(){ public View getView(){
return itemView; return itemView;
@ -384,6 +383,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
left_buttons = itemView.findViewById(R.id.left_buttons); left_buttons = itemView.findViewById(R.id.left_buttons);
status_show_more_content = itemView.findViewById(R.id.status_show_more_content); status_show_more_content = itemView.findViewById(R.id.status_show_more_content);
spark_button_fav = itemView.findViewById(R.id.spark_button_fav); spark_button_fav = itemView.findViewById(R.id.spark_button_fav);
spark_button_reblog = itemView.findViewById(R.id.spark_button_reblog);
} }
} }
@ -639,18 +639,24 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
final float scale = context.getResources().getDisplayMetrics().density; final float scale = context.getResources().getDisplayMetrics().density;
holder.spark_button_fav.setActiveImageTint(R.color.marked_icon); holder.spark_button_fav.setActiveImageTint(R.color.marked_icon);
holder.spark_button_reblog.setActiveImageTint(R.color.boost_icon);
if( theme == THEME_DARK) if( theme == THEME_DARK) {
holder.spark_button_fav.setInActiveImageTint(R.color.action_dark); holder.spark_button_fav.setInActiveImageTint(R.color.action_dark);
else if(theme == THEME_BLACK) holder.spark_button_reblog.setInActiveImageTint(R.color.action_dark);
}else if(theme == THEME_BLACK) {
holder.spark_button_fav.setInActiveImageTint(R.color.action_black); holder.spark_button_fav.setInActiveImageTint(R.color.action_black);
else holder.spark_button_reblog.setInActiveImageTint(R.color.action_black);
}else {
holder.spark_button_fav.setInActiveImageTint(R.color.action_light); holder.spark_button_fav.setInActiveImageTint(R.color.action_light);
holder.spark_button_reblog.setInActiveImageTint(R.color.action_light);
}
holder.spark_button_fav.setColors(R.color.marked_icon, R.color.marked_icon);
holder.spark_button_fav.setImageSize((int) (20 * iconSizePercent/100 * scale + 0.5f)); holder.spark_button_fav.setImageSize((int) (20 * iconSizePercent/100 * scale + 0.5f));
holder.spark_button_fav.pressOnTouch(false);
holder.spark_button_fav.setMinimumWidth((int)Helper.convertDpToPixel((20 * iconSizePercent/100 * scale + 0.5f),context)); holder.spark_button_fav.setMinimumWidth((int)Helper.convertDpToPixel((20 * iconSizePercent/100 * scale + 0.5f),context));
holder.spark_button_reblog.setColors(R.color.boost_icon, R.color.boost_icon);
holder.spark_button_reblog.setImageSize((int) (20 * iconSizePercent/100 * scale + 0.5f));
holder.spark_button_reblog.setMinimumWidth((int)Helper.convertDpToPixel((20 * iconSizePercent/100 * scale + 0.5f),context));
Drawable imgConversation = null; Drawable imgConversation = null;
if( type != RetrieveFeedsAsyncTask.Type.CONTEXT && ((status.getIn_reply_to_account_id() != null && status.getIn_reply_to_account_id().equals(status.getAccount().getId())) if( type != RetrieveFeedsAsyncTask.Type.CONTEXT && ((status.getIn_reply_to_account_id() != null && status.getIn_reply_to_account_id().equals(status.getAccount().getId()))
@ -1201,20 +1207,20 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
Drawable imgReblog, imgReply; Drawable imgReblog, imgReply;
if( !status.isFavAnimated() ) {
if( status.isReblogged()|| (status.getReblog() != null && status.getReblog().isReblogged())) { if (status.isFavourited() || (status.getReblog() != null && status.getReblog().isFavourited())) {
changeDrawableColor(context, R.drawable.ic_repeat_boost,R.color.boost_icon); holder.spark_button_fav.setChecked(true);
imgReblog = ContextCompat.getDrawable(context, R.drawable.ic_repeat_boost); } else {
}else { holder.spark_button_fav.setChecked(false);
if( theme == THEME_DARK ) }
changeDrawableColor(context, R.drawable.ic_repeat,R.color.action_dark); }
else if(theme == THEME_BLACK) if( !status.isBoostAnimated()){
changeDrawableColor(context, R.drawable.ic_repeat,R.color.action_black); if( status.isReblogged()|| (status.getReblog() != null && status.getReblog().isReblogged())) {
else holder.spark_button_reblog.setChecked(true);
changeDrawableColor(context, R.drawable.ic_repeat,R.color.action_light); }else {
imgReblog = ContextCompat.getDrawable(context, R.drawable.ic_repeat); holder.spark_button_reblog.setChecked(false);
}
} }
if( theme == THEME_DARK) if( theme == THEME_DARK)
changeDrawableColor(context, R.drawable.ic_reply,R.color.action_dark); changeDrawableColor(context, R.drawable.ic_reply,R.color.action_dark);
@ -1225,12 +1231,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
imgReply = ContextCompat.getDrawable(context, R.drawable.ic_reply); imgReply = ContextCompat.getDrawable(context, R.drawable.ic_reply);
assert imgReblog != null;
imgReblog.setBounds(0,0,(int) (20 * iconSizePercent/100 * scale + 0.5f),(int) (20 * iconSizePercent/100 * scale + 0.5f));
assert imgReply != null; assert imgReply != null;
imgReply.setBounds(0,0,(int) (20 * iconSizePercent/100 * scale + 0.5f),(int) (20 * iconSizePercent/100 * scale + 0.5f)); imgReply.setBounds(0,0,(int) (20 * iconSizePercent/100 * scale + 0.5f),(int) (20 * iconSizePercent/100 * scale + 0.5f));
holder.status_reblog_count.setCompoundDrawables(imgReblog, null, null, null);
if(isCompactMode && ((status.getReblog() == null && status.getReplies_count() > 1) || (status.getReblog() != null && status.getReblog().getReplies_count() > 1))){ if(isCompactMode && ((status.getReblog() == null && status.getReplies_count() > 1) || (status.getReblog() != null && status.getReblog().getReplies_count() > 1))){
Drawable img = context.getResources().getDrawable( R.drawable.ic_plus_one ); Drawable img = context.getResources().getDrawable( R.drawable.ic_plus_one );
@ -1367,22 +1370,30 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
} }
}); });
if( status.isFavAnimated()){
holder.spark_button_fav.playAnimation();
status.setFavAnimated(false);
}
if( status.isBoostAnimated()){
holder.spark_button_reblog.playAnimation();
status.setBoostAnimated(false);
}
holder.spark_button_fav.setOnClickListener(new View.OnClickListener() { holder.spark_button_fav.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
Log.v(Helper.TAG,"status.isFavourited(): " + status.isFavourited()); if( !status.isFavourited())
holder.spark_button_fav.setChecked(status.isFavourited()); status.setFavAnimated(true);
holder.spark_button_fav.animate();
CrossActions.doCrossAction(context, type, status, null, (status.isFavourited()|| (status.getReblog() != null && status.getReblog().isFavourited()))? API.StatusAction.UNFAVOURITE:API.StatusAction.FAVOURITE, statusListAdapter, StatusListAdapter.this, true); CrossActions.doCrossAction(context, type, status, null, (status.isFavourited()|| (status.getReblog() != null && status.getReblog().isFavourited()))? API.StatusAction.UNFAVOURITE:API.StatusAction.FAVOURITE, statusListAdapter, StatusListAdapter.this, true);
} }
}); });
holder.status_reblog_count.setOnClickListener(new View.OnClickListener() { holder.spark_button_reblog.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if( !status.isReblogged())
status.setBoostAnimated(true);
CrossActions.doCrossAction(context, type, status, null, (status.isReblogged()|| (status.getReblog() != null && status.getReblog().isReblogged()))? API.StatusAction.UNREBLOG:API.StatusAction.REBLOG, statusListAdapter, StatusListAdapter.this, true); CrossActions.doCrossAction(context, type, status, null, (status.isReblogged()|| (status.getReblog() != null && status.getReblog().isReblogged()))? API.StatusAction.UNREBLOG:API.StatusAction.REBLOG, statusListAdapter, StatusListAdapter.this, true);
} }
}); });
@ -2253,7 +2264,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
} }
position++; position++;
} }
statusListAdapter.notifyDataSetChanged();
}else if( statusAction == API.StatusAction.UNFAVOURITE){ }else if( statusAction == API.StatusAction.UNFAVOURITE){
int position = 0; int position = 0;
for(Status status: statuses){ for(Status status: statuses){

View File

@ -696,12 +696,21 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<RelativeLayout <LinearLayout
android:layout_marginLeft="15dp" android:layout_marginLeft="15dp"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_reblog"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_repeat_boost"
app:sparkbutton_inActiveImage="@drawable/ic_repeat"
app:sparkbutton_iconSize="20dp"
/>
<TextView <TextView
android:drawablePadding="2dp" android:drawablePadding="2dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
@ -709,7 +718,7 @@
android:id="@+id/status_reblog_count" android:id="@+id/status_reblog_count"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</RelativeLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_marginLeft="15dp" android:layout_marginLeft="15dp"
@ -722,13 +731,10 @@
android:id="@+id/spark_button_fav" android:id="@+id/spark_button_fav"
android:layout_width="30dp" android:layout_width="30dp"
android:layout_height="30dp" android:layout_height="30dp"
app:sparkbutton_activeImageTint="@color/marked_icon"
app:sparkbutton_inActiveImageTint="@color/marked_icon"
app:sparkbutton_activeImage="@drawable/ic_star" app:sparkbutton_activeImage="@drawable/ic_star"
app:sparkbutton_inActiveImage="@drawable/ic_star_border" app:sparkbutton_inActiveImage="@drawable/ic_star_border"
app:sparkbutton_iconSize="20dp" app:sparkbutton_iconSize="20dp"
app:sparkbutton_primaryColor="@color/marked_icon" />
app:sparkbutton_secondaryColor="@color/marked_icon" />
<TextView <TextView
android:drawablePadding="2dp" android:drawablePadding="2dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"

View File

@ -19,6 +19,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_container" android:id="@+id/main_container"
android:paddingTop="10dp" android:paddingTop="10dp"
android:layout_marginStart="5dp" android:layout_marginStart="5dp"
@ -27,8 +28,7 @@
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:divider="?android:dividerHorizontal" android:divider="?android:dividerHorizontal"
android:showDividers="end" android:showDividers="end"
android:orientation="vertical" android:orientation="vertical">
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -701,24 +701,52 @@
android:id="@+id/status_reply" android:id="@+id/status_reply"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<TextView <LinearLayout
android:layout_marginLeft="15dp" android:layout_marginLeft="15dp"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_reblog_count"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_gravity="center_vertical"
<TextView android:orientation="horizontal"
android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_reblog"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_repeat_boost"
app:sparkbutton_inActiveImage="@drawable/ic_repeat"
app:sparkbutton_iconSize="20dp"
/>
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_reblog_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_marginLeft="15dp" android:layout_marginLeft="15dp"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_favorite_count"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_fav"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_star"
app:sparkbutton_inActiveImage="@drawable/ic_star_border"
app:sparkbutton_iconSize="20dp"
/>
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_favorite_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView <ImageView
android:layout_marginLeft="15dp" android:layout_marginLeft="15dp"

View File

@ -19,6 +19,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_container" android:id="@+id/main_container"
android:paddingTop="10dp" android:paddingTop="10dp"
android:layout_marginStart="5dp" android:layout_marginStart="5dp"
@ -27,8 +28,7 @@
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:divider="?android:dividerHorizontal" android:divider="?android:dividerHorizontal"
android:showDividers="end" android:showDividers="end"
android:orientation="vertical" android:orientation="vertical">
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -616,24 +616,52 @@
android:id="@+id/status_reply" android:id="@+id/status_reply"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<TextView <LinearLayout
android:layout_marginLeft="20dp" android:layout_marginLeft="15dp"
android:layout_marginStart="20dp" android:layout_marginStart="15dp"
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_reblog_count"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginLeft="20dp"
android:layout_marginStart="20dp"
android:drawablePadding="2dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:gravity="center_vertical" android:orientation="horizontal"
android:id="@+id/status_favorite_count" android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_reblog"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_repeat_boost"
app:sparkbutton_inActiveImage="@drawable/ic_repeat"
app:sparkbutton_iconSize="20dp"
/>
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_reblog_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_fav"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_star"
app:sparkbutton_inActiveImage="@drawable/ic_star_border"
app:sparkbutton_iconSize="20dp"
/>
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_favorite_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView <ImageView
android:layout_marginLeft="20dp" android:layout_marginLeft="20dp"