Skip to content

Commit

Permalink
加入一些动画
Browse files Browse the repository at this point in the history
  • Loading branch information
chenyangcun committed Aug 1, 2015
1 parent 108f513 commit f0dd761
Show file tree
Hide file tree
Showing 27 changed files with 175 additions and 56 deletions.
2 changes: 1 addition & 1 deletion .idea/.name

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 0 additions & 6 deletions .idea/encodings.xml

This file was deleted.

16 changes: 0 additions & 16 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion app/app.iml
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@
<orderEntry type="library" exported="" name="recyclerview-v7-22.2.0" level="project" />
<orderEntry type="library" exported="" name="cardview-v7-22.2.0" level="project" />
<orderEntry type="library" exported="" name="appcompat-v7-22.2.0" level="project" />
<orderEntry type="library" exported="" name="android-async-http-1.4.7" level="project" />
<orderEntry type="library" exported="" name="gson-2.3" level="project" />
<orderEntry type="library" exported="" name="android-async-http-1.4.7" level="project" />
<orderEntry type="library" exported="" name="material-dialogs-0.7.6.0" level="project" />
</component>
</module>
13 changes: 9 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aswifter.material">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
Expand All @@ -11,7 +11,8 @@
android:theme="@style/AppTheme">
<activity
android:name="com.aswifter.material.MainActivity"
android:label="@string/app_name">
android:label="@string/app_name"
android:theme="@style/DrawerLayoutTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand All @@ -23,8 +24,12 @@
<activity android:name=".example.RecycleViewActivity"></activity>
<activity android:name=".example.EditTextFLActivity"></activity>
<activity android:name=".example.CardViewActivity"></activity>
<activity android:name=".example.AppBarDetailActivity"></activity>
<activity android:name=".book.BookDetailActivity"></activity>
<activity
android:name=".example.AppBarDetailActivity"
android:theme="@style/DrawerLayoutTheme"></activity>
<activity
android:name=".book.BookDetailActivity"
android:theme="@style/DrawerLayoutTheme"></activity>

</application>

Expand Down
Binary file added app/src/main/ic_launcher-web.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 6 additions & 4 deletions app/src/main/java/com/aswifter/material/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.aswifter.material;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
Expand All @@ -25,6 +23,8 @@ public class MainActivity extends AppCompatActivity implements BackHandledFragme
private BackHandledFragment selectedFragment;
private NavigationView mNavigationView;

private static final int ANIM_DURATION_TOOLBAR = 300;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand All @@ -40,13 +40,15 @@ protected void onCreate(Bundle savedInstanceState) {
mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
setupDrawerContent(mNavigationView);

switchToBook();

//profile Image
setUpProfileImage();


switchToBook();

}


private void switchToBook() {
getSupportFragmentManager().beginTransaction().replace(R.id.frame_content, new BooksFragment()).commit();
mToolbar.setTitle(R.string.navigation_book);
Expand Down
48 changes: 48 additions & 0 deletions app/src/main/java/com/aswifter/material/Utils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.aswifter.material;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.os.Build;
import android.view.Display;
import android.view.WindowManager;

/**
* Created by froger_mcs on 05.11.14.
*/
public class Utils {
private static int screenWidth = 0;
private static int screenHeight = 0;

public static int dpToPx(int dp) {
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

public static int getScreenHeight(Context c) {
if (screenHeight == 0) {
WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
screenHeight = size.y;
}

return screenHeight;
}

public static int getScreenWidth(Context c) {
if (screenWidth == 0) {
WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
screenWidth = size.x;
}

return screenWidth;
}

public static boolean isAndroid5() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
}
}
2 changes: 1 addition & 1 deletion app/src/main/java/com/aswifter/material/book/Book.java
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ public String toString() {
}

private static AsyncHttpClient client = new AsyncHttpClient(true, 80, 443);
;

private static final String BASE_URL = "https://api.douban.com/v2/";

private static String getAbsoluteUrl(String relativeUrl) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public void onClick(View view) {
tabLayout.setupWithViewPager(mViewPager);
}


private void setupViewPager(ViewPager mViewPager) {
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
adapter.addFragment(DetailFragment.newInstance(mBook.getSummary()), "内容简介");
Expand All @@ -71,7 +72,6 @@ private void setupViewPager(ViewPager mViewPager) {
}



static class MyPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
Expand Down
93 changes: 78 additions & 15 deletions app/src/main/java/com/aswifter/material/book/BooksFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
Expand All @@ -14,15 +16,19 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.OvershootInterpolator;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.afollestad.materialdialogs.MaterialDialog;
import com.aswifter.material.R;
import com.aswifter.material.Utils;
import com.aswifter.material.widget.RecyclerItemClickListener;
import com.bumptech.glide.Glide;

import java.util.ArrayList;
import java.util.List;

/**
Expand All @@ -33,6 +39,9 @@ public class BooksFragment extends Fragment {
private RecyclerView mRecyclerView;
private MyAdapter mAdapter;
private ProgressBar mProgressBar;
private FloatingActionButton mFabButton;

private static final int ANIM_DURATION_FAB = 400;

@Nullable
@Override
Expand All @@ -46,33 +55,39 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);

mAdapter = new MyAdapter(getActivity());
mRecyclerView.setAdapter(mAdapter);

setUpFAB(view);
return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mFabButton.setTranslationY(2 * getResources().getDimensionPixelOffset(R.dimen.btn_fab_size));
doSearch(getString(R.string.default_search_keyword));
}


private void doSearch(String keyword) {
mProgressBar.setVisibility(View.VISIBLE);
mAdapter.clearItems();
Book.searchBooks(keyword, new Book.IBookResponse<List<Book>>() {
@Override
public void onData(List<Book> books) {
mAdapter = new MyAdapter(getActivity(), books);
mRecyclerView.setAdapter(mAdapter);
mProgressBar.setVisibility(View.GONE);
startFABAnimation();
mAdapter.updateItems(books, true);
}
});
}


private void setUpFAB(View view) {
FloatingActionButton button = (FloatingActionButton) view.findViewById(R.id.fab_normal);
button.setOnClickListener(new View.OnClickListener() {
mFabButton = (FloatingActionButton) view.findViewById(R.id.fab_normal);
mFabButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new MaterialDialog.Builder(getActivity())
Expand All @@ -92,26 +107,49 @@ public void onInput(MaterialDialog dialog, CharSequence input) {
}


private void startFABAnimation() {
mFabButton.animate()
.translationY(0)
.setInterpolator(new OvershootInterpolator(1.f))
.setStartDelay(500)
.setDuration(ANIM_DURATION_FAB)
.start();
}


private RecyclerItemClickListener.OnItemClickListener onItemClickListener = new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {

Book book = mAdapter.getBook(position);
Intent intent = new Intent(getActivity(), BookDetailActivity.class);
intent.putExtra("book", book);
startActivity(intent);

ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
view.findViewById(R.id.ivBook), getString(R.string.transition_book_img));

ActivityCompat.startActivity(getActivity(), intent, options.toBundle());

}
};

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private final int mBackground;
private List<Book> mBooks;
private List<Book> mBooks = new ArrayList<Book>();
private final TypedValue mTypedValue = new TypedValue();

// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
private static final int ANIMATED_ITEMS_COUNT = 4;

private boolean animateItems = false;
private int lastAnimatedPosition = -1;

// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(Context context) {
context.getTheme().resolveAttribute(R.attr.selectableItemBackground, mTypedValue, true);
mBackground = mTypedValue.resourceId;
}


public class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public ImageView ivBook;
Expand All @@ -129,13 +167,37 @@ public ViewHolder(View v) {
}


// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(Context context, List<Book> books) {
mBooks = books;
context.getTheme().resolveAttribute(R.attr.selectableItemBackground, mTypedValue, true);
mBackground = mTypedValue.resourceId;
private void runEnterAnimation(View view, int position) {
if (!animateItems || position >= ANIMATED_ITEMS_COUNT - 1) {
return;
}

if (position > lastAnimatedPosition) {
lastAnimatedPosition = position;
view.setTranslationY(Utils.getScreenHeight(getActivity()));
view.animate()
.translationY(0)
.setStartDelay(100 * position)
.setInterpolator(new DecelerateInterpolator(3.f))
.setDuration(700)
.start();
}
}


public void updateItems(List<Book> books, boolean animated) {
animateItems = animated;
lastAnimatedPosition = -1;
mBooks.addAll(books);
notifyDataSetChanged();
}

public void clearItems() {
mBooks.clear();
notifyDataSetChanged();
}


@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
Expand All @@ -150,6 +212,7 @@ public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
runEnterAnimation(holder.itemView, position);
Book book = mBooks.get(position);
holder.tvTitle.setText(book.getTitle());
String desc = "作者: " + book.getAuthor()[0] + "\n副标题: " + book.getSubtitle()
Expand Down
Loading

0 comments on commit f0dd761

Please sign in to comment.