Giter Site home page Giter Site logo

500px / greedo-layout-for-android Goto Github PK

View Code? Open in Web Editor NEW
1.6K 85.0 157.0 1.73 MB

Full aspect ratio grid LayoutManager for Android's RecyclerView

License: MIT License

Java 100.00%
android-recyclerview android grid greedo-layout recyclerview layout aspect-ratio

greedo-layout-for-android's Introduction

Greedo Layout for Android

A drop-in custom layout manager for Android RecyclerViews to layout a grid of photos while respecting their aspect ratios.

image

Setup

Download the latest release via Gradle:

repositories {
	maven { url 'https://github.com/500px/greedo-layout-for-android/raw/master/releases/' }
}

dependencies {
	compile 'com.fivehundredpx:greedo-layout:1.5.1'
}

Usage

See the sample project for a complete solution on how to use GreedoLayout. Below are the specific steps.

// Create an instance of the GreedoLayoutManager and pass it to the RecyclerView
MyRecyclerAdapter recyclerAdapter = new MyRecyclerAdapter(this);
GreedoLayoutManager layoutManager = new GreedoLayoutManager(recyclerAdapter);

RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(recyclerAdapter);

// Set the max row height in pixels
layoutManager.setMaxRowHeight(300);

// If you would like to add spacing between items (Note, MeasUtils is in the sample project)
int spacing = MeasUtils.dpToPx(4, this);
recyclerView.addItemDecoration(new GreedoSpacingItemDecoration(spacing));

And then, in your RecyclerView adapter, or some other class of your choosing, implement SizeCalculatorDelegate. This implementation got passed to the layout manager above.

public class MyRecyclerAdapter extends RecyclerView.Adapter<ViewHolder> implements SizeCalculatorDelegate {
    @Override
    public double aspectRatioForIndex(int index) {
    	// Return the aspect ratio of your image at the given index
    }
}

License

GreedoLayout is released under the MIT license. See LICENSE for details.

greedo-layout-for-android's People

Contributors

anenha avatar anurlybayev avatar beltex avatar derek-500px avatar itspriyesh avatar jvillella avatar mck182 avatar veyndan avatar zhiweideng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

greedo-layout-for-android's Issues

scrollToPosition() crashes

Hi, guys.

when using scrollToPosition() the sample app is crashing when applying 499 as paramter for example with (any item number that is not the first in the row IMHO):

Process: com.fivehundredpx.greedo_layout_sample, PID: 10356 java.lang.IndexOutOfBoundsException: Invalid index 499, size is 499 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at com.fivehundredpx.greedolayout.GreedoLayoutSizeCalculator.getRowForChildPosition(GreedoLayoutSizeCalculator.java:77) at com.fivehundredpx.greedolayout.GreedoLayoutManager.rowForChildPosition(GreedoLayoutManager.java:262) at com.fivehundredpx.greedolayout.GreedoLayoutManager.scrollToPosition(GreedoLayoutManager.java:290) at android.support.v7.widget.RecyclerView.scrollToPosition(RecyclerView.java:1341) at com.fivehundredpx.greedo_layout_sample.SampleActivity$1.run(SampleActivity.java:42) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Any idea why ?

Anyway, after trying to alter the code I've managed to get the scrollToPosition() to work but with one exception. Please refer to this. any help is appreciated.

Edit: after trying position 498 it worked but it has the same issue as I posted on SO above in the link.
See refer image:

screenshot_20160418-142052

So it is pretty much the same. It looks as the recyclerview is scrolling to a position almost at the end of the content so it create "white space" below in order for it to position the scrolled item at the top. any idea why ? Is this normal behavior ?

@JVillella

Adding Headers (Create Sections)

First of all, amazing work, seriously.

My question is how to add headers and divide the images to sections ?

I need to sort the images by date and then show them section after section.

If this is not a feature that should be written at all, do you have any idea on how to solve this ?
I trully need this kind of thing.
If I'll add a photo that will take the entire screen width, will it work ?

Edit: I must use the same RecyclerView for them all for Drag and Select for deletion (I Use DragSelectRecyclerView) so I can't have more RecyclerViews like I wanted.

Items that are not ImageViews cause disorted photos

When I'm trying to wrap ImageView with, say, RelativeLayout, the items becomes disorted.

Why is that ? I want to add views on top of imageView so I need a container but that makes thing look very bad.

Any idea why ?

GreedoLayout accessing out-of-bounds index

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pixerf.android, PID: 19384
java.lang.IndexOutOfBoundsException: Index: 56, Size: 56
at java.util.ArrayList.get(ArrayList.java:411)
at com.fivehundredpx.greedolayout.GreedoLayoutSizeCalculator.sizeForChildAtPosition(GreedoLayoutSizeCalculator.java:71)
at com.fivehundredpx.greedolayout.GreedoLayoutManager.sizeForChildAtPosition(GreedoLayoutManager.java:282)
at com.fivehundredpx.greedolayout.GreedoLayoutManager.preFillGrid(GreedoLayoutManager.java:206)
at com.fivehundredpx.greedolayout.GreedoLayoutManager.onLayoutChildren(GreedoLayoutManager.java:122)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3719)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3436)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3988)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:611)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1769)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:874)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:724)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
at android.view.Choreographer.doCallbacks(Choreographer.java:683)
at android.view.Choreographer.doFrame(Choreographer.java:619)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
at android.os.Handler.handleCallback(Handler.java:751)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

onLayoutChildren called while scrolling

I'm noticing an issue with scrolling that I haven't been able to root cause. What's happening is when I scroll (and this mainly occurs when scrolling up) fast, you'll see blank space, it's like the layout hasn't completed yet. Sometimes it will catch up and layout the items in the space, and other times it will just remain empty and have missing layouts.

I noticed that onLayoutChildren was repeatedly getting called while scrolling (at least 10 times per scroll), which seems to be the culprit, but I don't see this behavior in the sample app, yet I have practically the same setup albeit my adapter is backed by a cursor, rather than a list.

Have you guys seen an issue like this before?

Problem with saving the state of recyclerView

Hey guys

I have a problemwith saving the state of Recycler View using Greedo Layout Manager. I get this exception when calling:

recyclerView.scrollToPosition(index);

in onResume()

03-06 12:35:55.287 20863-20863/com.artland E/AndroidRuntime: FATAL EXCEPTION: main Process: com.artland, PID: 20863 java.lang.RuntimeException: Invalid content width. Did you forget to set it? at com.fivehundredpx.greedolayout.GreedoLayoutSizeCalculator.computeChildSizesUpToPosition(GreedoLayoutSizeCalculator.java:101) at com.fivehundredpx.greedolayout.GreedoLayoutSizeCalculator.getRowForChildPosition(GreedoLayoutSizeCalculator.java:79) at com.fivehundredpx.greedolayout.GreedoLayoutManager.rowForChildPosition(GreedoLayoutManager.java:278) at com.fivehundredpx.greedolayout.GreedoLayoutManager.scrollToPosition(GreedoLayoutManager.java:306)

Any idea on how to fix it? Weird thing is, that both setContentWidth() and setMaxRowHeight() are public void methods, but I can only use setMaxRowHeight() when configuring the GreedoLayoutManager. setContentWidth() is not even visible as a useable method.

Would highly appreciate any help! @mck182

Have last row expand to fill leftover width

Hello.

Is it possible to add feature to fill full width on the last row? Without leaving blank space?

Blank spaces are okay when it's used in simple way (just recyclerView itself), but I want to use it as another recyclerView item, i.e main recyclerView items are recycylerViews with greedoLayoutManager.

Example usage case could be, photosets for post. Post is item of main recyclerView, and photoset is inner recyclerView with greedoLayoutManager.

Screenshots

First one is okay, but not second.

Add on-demand ratio calculation

This is a cool library. Is it possible to use without loading images before they're displayed? In the sample app you use Picasso to load images, but you have to load all the images manually anyway to calculate their ratios, which seems to defeat the point of using an image loader.

If you wanted to use Picasso to load images from the network, for example, would that be impossible with this library?

Is there a LinearLayout version?

I am building an app and i need a custom LinearLayout Manager to support items with different heights.
In fact the app fetches images from a server with different aspect ratios so each item must have the equivalent height. Server returns the aspect ratios for each image so i know them all ready.

Is it possible to tweak the greedolayout some how to achieve the desired result ?

Custom layout inside adapter

I'm trying to add custom layout but getting weird output.

raw.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:background="@android:color/darker_gray">
    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="test"
        android:textColor="@android:color/black" />
</FrameLayout>

Adapter code

Output
aaaa

Image are not display as per aspect ratio, can you please shade the light that where I'm lacking.

This is how It should look (It is created with dynamic imageview but I need to generate view via xml)
bbb

scrollToPosition to last item leaves blank area in view

when scrollToPosition is called over last item, last items moves to first position and leaves whole screen as blank. It should not make screen blank and should last items should be shown at end of the screen. It is not properly handled in as on other standard layout managers.

Adding Footer

Is there a way to add a footer to this layout manager as I want to show pagination loading progress at the bottom/last item of the list in the adapter. As of now its kind of not possible as the layout manager only takes the aspect ratio to define the items width.
Adding Footer to this manager should like adding a header which is already provided in the library. I also know adding the footer will be kind of tricky.
Any help would be appreciated.

ArrayIndexOutOfBoundsException in aspectRatioForIndex

I noticed GreedoLayout will crash unless you handle the case in your aspectRatioForIndex method by including the line:

if (index >= getItemCount()) return 1.0;

This seems like a bug, and if not it should be mentioned that it is a requirement or we will crash.

Here's the stack trace, if we don't include that line:

    Process: com.fivehundredpx.greedo_layout_sample, PID: 31450
    java.lang.ArrayIndexOutOfBoundsException: length=17; index=17
        at com.fivehundredpx.greedo_layout_sample.PhotosAdapter.aspectRatioForIndex(PhotosAdapter.java:27)
        at com.fivehundredpx.greedolayout.GreedoLayoutSizeCalculator.computeChildSizesUpToPosition(GreedoLayoutSizeCalculator.java:123)
        at com.fivehundredpx.greedolayout.GreedoLayoutSizeCalculator.sizeForChildAtPosition(GreedoLayoutSizeCalculator.java:68)
        at com.fivehundredpx.greedolayout.GreedoLayoutManager.sizeForChildAtPosition(GreedoLayoutManager.java:302)
        at com.fivehundredpx.greedolayout.GreedoLayoutManager.preFillGrid(GreedoLayoutManager.java:222)
        at com.fivehundredpx.greedolayout.GreedoLayoutManager.onLayoutChildren(GreedoLayoutManager.java:136)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3962)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
        at android.view.View.layout(View.java:20672)
        at android.view.ViewGroup.layout(ViewGroup.java:6194)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2799)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2316)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1463)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7190)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Sample project scrolling is choppy

Have you test it ?
On a Samsung Galaxy s6 with L android it does not work at all
scroll is very choppy images are disappeared as you scroll back again.
I can provide a screen capture if you wish

Is it possible to have Recycler View with GreedoLayout manager inside a row of another recycler view?

I like how Greedo works and it suits my need perfectly well, but what I want to achieve is have a recycler view whose row consist of another recycler view having greedo layout manager. The problem I am facing this is GreedoLayout manager does not wrap the height of the recycler view to wrap content make it impossible for me to achieve what I want, can you please possibly suggest a way to achieve this?

Sample implement in Fragment extension

Any way to add a class in sample app to display how to implement in a fragment?

recyclerview is called in Mainactivity extended to AppCompatActivity
can you post example of it extended to Fragment?

Problems with D-pad navigation

I'm using the library in an Android TV app, so navigation with D-pad is a requirement for me. When I press down in a list, the focusing works correctly until I reach the last displayed row. Pressing down from there does nothing, and onFocusSearchFailed() is called in the layout manager.

I've worked around this by subclassing the layout manager and scrolling a little when the focus search fails:

override fun onFocusSearchFailed(focused: View, focusDirection: Int,
                                 recycler: RecyclerView.Recycler, state: RecyclerView.State): View? {
    // Need to be called in order to layout new row
    scrollVerticallyBy(when (focusDirection) {
        View.FOCUS_DOWN -> 10
        View.FOCUS_UP -> -10
        else -> 0
    }, recycler, state)

    return super.onFocusSearchFailed(focused, focusDirection, recycler, state)
}

But there is probably a better way to do this.

Thanks for the nice library!

Adding a simple TextView to a PhotoViewHolder

Hey guys!

I have a problem with customizing the appearance of items put into greedoLayout. I want to display pictures with a text underneath them. However, if I create a custom layout (relative, linear, whatsoever), the pictures will come out distorted and the app will be very slow and flickering.

public PhotoViewHolder(ImageView imageView) {
super(imageView);
mImageView = imageView;
}

How can I add a TextView to appear under each of the pictures?

I would highly appreciate if you helped me out!

when single image make width to match_parent.

Hello,

Can it be possible to make image width to match_parent( same as device width) when there is only one image in list? I just apply below code but no luck.

        int imgWidth = width[0] * (int) mContext.getResources().getDisplayMetrics().density;
        int imagHeight = height[0] * (int) mContext.getResources().getDisplayMetrics().density;
        int height = (deviceWidth * imagHeight) / imgWidth;

       holder.imageView.getLayoutParams().height = height;
        holder.imageView.getLayoutParams().width = deviceWidth;

device-2016-04-08-121748

not show the scrollbar

I have add the scrollbars attribute to the RecyclerView, like this
android:scrollbars="vertical"
but it still not show the scrollbar. I think we should show the scrollbar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.