/* * Copyright 2014 Soichiro Kashima * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.xinxin.everyxday.activity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.view.WindowManager; import android.view.animation.AccelerateInterpolator; import android.view.animation.OvershootInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks; import com.github.ksoichiro.android.observablescrollview.ScrollState; import com.github.ksoichiro.android.observablescrollview.Scrollable; import com.nineoldandroids.animation.ValueAnimator; import com.nineoldandroids.view.ViewHelper; import com.readystatesoftware.systembartint.SystemBarTintManager; import com.xinxin.everyxday.R; import com.xinxin.everyxday.dao.model.Like; import com.xinxin.everyxday.dao.util.DbService; import com.xinxin.everyxday.widget.swipeback.SwipeBackSherlockActivity; import java.util.Date; import java.util.HashMap; import java.util.Map; public abstract class ToolbarControlBaseActivity<S extends Scrollable> extends SwipeBackSherlockActivity implements ObservableScrollViewCallbacks { private Toolbar mToolbar; private S mScrollable; private String viewTitle; private TextView titleTextView; private ImageView likeImageView; private String avatar; private String cover; private Date createTime; private int newId; public String detailNew; private String category; private DbService mDbService; private final Map<ImageView, AnimatorSet> likeAnimations = new HashMap<>(); private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator(); private static final OvershootInterpolator OVERSHOOT_INTERPOLATOR = new OvershootInterpolator(4); @Override protected void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); if(intent == null){ finish(); return; } avatar = intent.getStringExtra("today_new_avatar"); cover = intent.getStringExtra("today_new_cover"); createTime = (Date)intent.getSerializableExtra("today_new_time"); System.out.println("time ========================= " + createTime.toString()); detailNew = intent.getStringExtra("today_detail_new_url"); newId = intent.getIntExtra("today_new_id", -1); viewTitle = intent.getStringExtra("today_new_title"); category = intent.getStringExtra("today_new_category"); super.onCreate(savedInstanceState); setContentView(getLayoutResId()); mDbService = DbService.getInstance(this); titleTextView = (TextView)findViewById(R.id.toolbar_title); titleTextView.setText(viewTitle); likeImageView = (ImageView)findViewById(R.id.imageView_like); if(mDbService.queryLike("WHERE NEWID = "+ newId).size() != 0){ likeImageView.setBackgroundResource(R.mipmap.ic_heart_red); }else{ likeImageView.setBackgroundResource(R.mipmap.ic_heart_outline_grey); } likeImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(mDbService.queryLike("WHERE NEWID = "+ newId).size() == 0){ Like likeBean = new Like(); likeBean.setAvatar(avatar); likeBean.setCover(cover); likeBean.setCreateTime(createTime); likeBean.setDetailNew(detailNew); likeBean.setNewid(newId + ""); likeBean.setTitle(viewTitle); likeBean.setCategory(category); mDbService.saveLike(likeBean); updateHeartButton(likeImageView, true); } } }); mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar.setNavigationIcon(getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha)); setSupportActionBar(mToolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); mScrollable = createScrollable(); mScrollable.setScrollViewCallbacks(this); } public void initToolBar(){ } protected abstract int getLayoutResId(); protected abstract S createScrollable(); @Override public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) { } @Override public void onDownMotionEvent() { } @Override public void onUpOrCancelMotionEvent(ScrollState scrollState) { Log.e("DEBUG", "onUpOrCancelMotionEvent: " + scrollState); if (scrollState == ScrollState.UP) { if (toolbarIsShown()) { hideToolbar(); } } else if (scrollState == ScrollState.DOWN) { if (toolbarIsHidden()) { showToolbar(); } } } private boolean toolbarIsShown() { return ViewHelper.getTranslationY(mToolbar) == 0; } private boolean toolbarIsHidden() { return ViewHelper.getTranslationY(mToolbar) == -mToolbar.getHeight(); } private void showToolbar() { moveToolbar(0); } private void hideToolbar() { moveToolbar(-mToolbar.getHeight()); } private void moveToolbar(float toTranslationY) { if (ViewHelper.getTranslationY(mToolbar) == toTranslationY) { return; } ValueAnimator animator = ValueAnimator.ofFloat(ViewHelper.getTranslationY(mToolbar), toTranslationY).setDuration(200); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float translationY = (float) animation.getAnimatedValue(); ViewHelper.setTranslationY(mToolbar, translationY); ViewHelper.setTranslationY((View) mScrollable, translationY); FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) ((View) mScrollable).getLayoutParams(); lp.height = (int) -translationY + getScreenHeight() - lp.topMargin; ((View) mScrollable).requestLayout(); } }); animator.start(); } private void updateHeartButton(final ImageView view, boolean animated) { if (animated) { if (!likeAnimations.containsKey(view)) { AnimatorSet animatorSet = new AnimatorSet(); likeAnimations.put(view, animatorSet); ObjectAnimator rotationAnim = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f); rotationAnim.setDuration(300); rotationAnim.setInterpolator(ACCELERATE_INTERPOLATOR); ObjectAnimator bounceAnimX = ObjectAnimator.ofFloat(view, "scaleX", 0.2f, 1f); bounceAnimX.setDuration(300); bounceAnimX.setInterpolator(OVERSHOOT_INTERPOLATOR); ObjectAnimator bounceAnimY = ObjectAnimator.ofFloat(view, "scaleY", 0.2f, 1f); bounceAnimY.setDuration(300); bounceAnimY.setInterpolator(OVERSHOOT_INTERPOLATOR); bounceAnimY.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { view.setBackgroundResource(R.mipmap.ic_heart_red); } }); animatorSet.play(rotationAnim); animatorSet.play(bounceAnimX).with(bounceAnimY).after(rotationAnim); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { likeAnimations.remove(view); } }); animatorSet.start(); } } } }