添加 ResponedScrollView

This commit is contained in:
seven332 committed 2014-08-09 00:00:08 +08:00
1 parent 90d95c6552
commit d0e1b4cfee
8 files changed
+215 -68

No files matched your search

+2 -2
View File
@@ -19,7 +19,7 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ScrollView
<com.hippo.ehviewer.widget.ResponedScrollView
android:id="@+id/detail_scroll"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
@@ -324,7 +324,7 @@
layout="@layout/preview_list"
android:visibility="gone" />
</LinearLayout>
</ScrollView>
</com.hippo.ehviewer.widget.ResponedScrollView>
<ScrollView
android:id="@+id/more_detail_scroll"
+4 -3
View File
@@ -15,6 +15,7 @@
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:auto="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
@@ -52,7 +53,7 @@
<com.hippo.ehviewer.widget.SuperButton
android:id="@+id/register"
style="@style/SuperButton.Small"
style="@style/SuperButton.Tile.Small"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10.0dp"
@@ -61,7 +62,7 @@
<com.hippo.ehviewer.widget.SuperButton
android:id="@+id/login"
style="@style/SuperButton.Small"
style="@style/SuperButton.Tile.Small"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
@@ -70,7 +71,7 @@
<com.hippo.ehviewer.widget.SuperButton
android:id="@+id/logout"
style="@style/SuperButton.Small"
style="@style/SuperButton.Tile.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
+2
View File
@@ -15,6 +15,8 @@
<br>
<a href="https://github.com/JakeWharton/DiskLruCache">DiskLruCache</a>
<br>
<a href="https://github.com/FaizMalkani/FloatingActionButton">FloatingActionButton</a>
<br>
<a href="https://github.com/BYVoid/OpenCC">OpenCC</a>
<br>
<a href="https://github.com/jfeinstein10/SlidingMenu">SlidingMenu</a>
+6
View File
@@ -79,6 +79,12 @@
<item name="@android:paddingRight">18dp</item>
</style>
<style name="SuperButton.Tile.Small" parent="@style/SuperButton.Small">
<item name="@android:paddingTop">2dp</item>
<item name="@android:paddingBottom">2dp</item>
<item name="backgroundType">tile</item>
</style>
<style name="MaterialProgress">
<item name="@android:layout_width">48dip</item>
<item name="@android:layout_height">48dip</item>
+6 -2
View File
@@ -57,7 +57,9 @@ public class ImageLoader {
mImageCache = ImageCache.getInstance(mContext);
mLock = new Object();
new Thread(new LoadFromCacheTask()).start();
Thread thread = new Thread(new LoadFromCacheTask());
thread.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
}
public final static ImageLoader getInstance(final Context context) {
@@ -116,7 +118,9 @@ public class ImageLoader {
synchronized (mLock) {
mDownloadTasks.push(loadTask);
if (mWorkingThreadNum < MAX_DOWNLOAD_THREADS) {
new Thread(new DownloadImageTask()).start();
Thread thread = new Thread(new DownloadImageTask());
thread.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mWorkingThreadNum++;
}
}
+92 -59
View File
@@ -439,7 +439,7 @@ public class EhClient {
public void getGList(final String url, final int mode, final Object checkFlag,
final OnGetGListListener listener) {
new Thread(new Runnable() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
HttpHelper hp = new HttpHelper(mAppContext);
@@ -476,7 +476,9 @@ public class EhClient {
mHandler.post(responder);
}
}).start();
});
thread.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
}
// Get Gallery List from file search
@@ -560,10 +562,10 @@ public class EhClient {
if (file == null && bitmap == null)
listener.onFailure(checkFlag, "All null"); // TODO
new Thread(new Runnable() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
HttpHelper hp = new HttpHelper(mAppContext);
HttpHelper hh = new HttpHelper(mAppContext);
List<HttpHelper.FormData> dataList = new LinkedList<HttpHelper.FormData>();
HttpHelper.FormData data;
@@ -600,11 +602,11 @@ public class EhClient {
dataList.add(data);
}
String body = hp.postFormData(getFileSearchUrl(apiMode), dataList);
String body = hh.postFormData(getFileSearchUrl(apiMode), dataList);
GetGListFromImageSearchResponder responder;
if (body != null) { // Get ok
// If no element, it might be a notice
String newUrl = hp.getLastUrl();
String newUrl = hh.getLastUrl();
if (newUrl == null) {
responder = new GetGListFromImageSearchResponder(listener, checkFlag, "Location is null");
} else if (!body.contains("<")) {
@@ -631,12 +633,14 @@ public class EhClient {
}
}
} else {
responder = new GetGListFromImageSearchResponder(listener, checkFlag, hp.getEMsg());
responder = new GetGListFromImageSearchResponder(listener, checkFlag, hh.getEMsg());
}
mHandler.post(responder);
}
}).start();
});
thread.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
}
// Get gallery Detail
@@ -645,64 +649,93 @@ public class EhClient {
public void onFailure(String eMsg);
}
private class GetGDetaiResponder implements Runnable {
private final boolean isOk;
private final OnGetGDetailListener listener;
private final GalleryDetail gd;
private final String eMesg;
public GetGDetaiResponder(OnGetGDetailListener listener, GalleryDetail gd) {
this.isOk = true;
this.listener = listener;
this.gd = gd;
this.eMesg = null;
}
public GetGDetaiResponder(OnGetGDetailListener listener, String eMsg) {
this.isOk = false;
this.listener = listener;
this.gd = null;
this.eMesg = eMsg;
}
@Override
public void run() {
if (isOk)
listener.onSuccess(gd);
else
listener.onFailure(eMesg);
}
}
public void getGDetail(final String url, final GalleryDetail md,
final OnGetGDetailListener listener) {
new Thread(new Runnable() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(Object obj) {
String body = (String)obj;
DetailParser parser = new DetailParser();
int result = parser.parser(body, DetailParser.DETAIL | DetailParser.TAG
| DetailParser.PREVIEW_INFO | DetailParser.PREVIEW
| DetailParser.COMMENT);
if (result == DetailParser.OFFENSIVE) {
md.firstPage = "offensive";
listener.onSuccess(md);
} else if (result == DetailParser.PINING) {
md.firstPage = "pining";
listener.onSuccess(md);
} else if ((result & (DetailParser.DETAIL | DetailParser.PREVIEW_INFO)) != 0) {
md.thumb = parser.thumb;
md.title = parser.title;
md.title_jpn = parser.title_jpn;
md.category = parser.category;
md.uploader = parser.uploader;
md.posted = parser.posted;
md.pages = parser.pages;
md.size = parser.size;
md.resized = parser.resized;
md.parent = parser.parent;
md.visible = parser.visible;
md.language = parser.language;
md.people = parser.people;
md.rating = parser.rating;
md.firstPage = parser.firstPage;
md.previewPerPage = parser.previewPerPage;
md.previewSum = parser.previewSum;
HttpHelper hh = new HttpHelper(mAppContext);
String body = hh.get(url);
GetGDetaiResponder responder;
if (body != null) {
DetailParser parser = new DetailParser();
int result = parser.parser(body, DetailParser.DETAIL | DetailParser.TAG
| DetailParser.PREVIEW_INFO | DetailParser.PREVIEW
| DetailParser.COMMENT);
if (result == DetailParser.OFFENSIVE) {
md.firstPage = "offensive";
responder = new GetGDetaiResponder(listener, md);
} else if (result == DetailParser.PINING) {
md.firstPage = "pining";
responder = new GetGDetaiResponder(listener, md);
} else if ((result & (DetailParser.DETAIL | DetailParser.PREVIEW_INFO)) != 0) {
md.thumb = parser.thumb;
md.title = parser.title;
md.title_jpn = parser.title_jpn;
md.category = parser.category;
md.uploader = parser.uploader;
md.posted = parser.posted;
md.pages = parser.pages;
md.size = parser.size;
md.resized = parser.resized;
md.parent = parser.parent;
md.visible = parser.visible;
md.language = parser.language;
md.people = parser.people;
md.rating = parser.rating;
md.firstPage = parser.firstPage;
md.previewPerPage = parser.previewPerPage;
md.previewSum = parser.previewSum;
md.tags = parser.tags;
md.previewLists = new PreviewList[md.previewSum];
md.previewLists[0] = parser.previewList;
md.comments = parser.comments;
listener.onSuccess(md);
} else if (result == DetailParser.ERROR) {
listener.onFailure(parser.eMesg);
} else {
listener.onFailure(mAppContext.getString(R.string.em_parser_error));
}
md.tags = parser.tags;
md.previewLists = new PreviewList[md.previewSum];
md.previewLists[0] = parser.previewList;
md.comments = parser.comments;
responder = new GetGDetaiResponder(listener, md);
} else if (result == DetailParser.ERROR) {
responder = new GetGDetaiResponder(listener, parser.eMesg);
} else {
responder = new GetGDetaiResponder(listener,
mAppContext.getString(R.string.em_parser_error));
}
@Override
public void onFailure(String eMsg) {
listener.onFailure(eMsg);
}
});
hp.get(url);
} else {
responder = new GetGDetaiResponder(listener, hh.getEMsg());
}
mHandler.post(responder);
}
}).start();
});
thread.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
}
// Get preview list
@@ -61,6 +61,7 @@ import android.widget.ViewSwitcher;
import com.faizmalkani.floatingactionbutton.FloatingActionButton;
import com.hippo.ehviewer.ImageLoader;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.cache.ImageCache;
import com.hippo.ehviewer.data.ApiGalleryDetail;
import com.hippo.ehviewer.data.Comment;
import com.hippo.ehviewer.data.GalleryDetail;
@@ -87,6 +88,7 @@ import com.hippo.ehviewer.widget.LoadImageView;
import com.hippo.ehviewer.widget.MaterialProgress;
import com.hippo.ehviewer.widget.ProgressiveRatingBar;
import com.hippo.ehviewer.widget.RefreshTextView;
import com.hippo.ehviewer.widget.ResponedScrollView;
import com.hippo.ehviewer.widget.SimpleGridLayout;
import com.hippo.ehviewer.widget.SuperButton;
import com.hippo.ehviewer.widget.SuperToast;
@@ -94,6 +96,7 @@ import com.hippo.ehviewer.windowsanimate.WindowsAnimate;
public class GalleryDetailActivity extends AbstractActivity
implements View.OnClickListener,
ResponedScrollView.OnScrollStateChangedListener,
View.OnTouchListener , ViewSwitcher.ViewFactory,
ProgressiveRatingBar.OnUserRateListener, PreviewList.PreviewHolder,
View.OnLayoutChangeListener, AdapterView.OnItemClickListener,
@@ -134,7 +137,7 @@ public class GalleryDetailActivity extends AbstractActivity
private MaterialProgress mPreviewWait;
private SuperButton mPreviewRefresh;
private ScrollView mDetailScroll;
private ResponedScrollView mDetailScroll;
private ScrollView mMoreDetailScroll;
private View mMoreComment;
@@ -289,7 +292,7 @@ public class GalleryDetailActivity extends AbstractActivity
actionBar.setDisplayHomeAsUpEnabled(true);
// Get view
mDetailScroll = (ScrollView)findViewById(R.id.detail_scroll);
mDetailScroll = (ResponedScrollView)findViewById(R.id.detail_scroll);
mMoreDetailScroll = (ScrollView)findViewById(R.id.more_detail_scroll);
mMoreComment = findViewById(R.id.more_comment);
mRefreshText = (RefreshTextView)findViewById(R.id.refresh_text);
@@ -399,6 +402,7 @@ public class GalleryDetailActivity extends AbstractActivity
mDetailComment.setOnTouchListener(this);
mMoreDetailScroll.addOnLayoutChangeListener(this);
mDetailScroll.addOnLayoutChangeListener(this);
mDetailScroll.setOnScrollStateChangedListener(this);
mCommentList.addOnLayoutChangeListener(this);
mPreviewPage.setOnClickListener(this);
mPreviewBack.setOnClickListener(this);
@@ -987,6 +991,17 @@ public class GalleryDetailActivity extends AbstractActivity
mPreviewRefresh.setVisibility(View.VISIBLE);
}
@Override
public void onScrollStateChanged(ResponedScrollView view, int state) {
if (view == mDetailScroll) {
ImageCache imageCache = ImageCache.getInstance(this);
if (state == ResponedScrollView.SCROLL_START)
imageCache.setPauseDiskCache(true);
else
imageCache.setPauseDiskCache(false);
}
}
private class GDetailGetListener
implements EhClient.OnGetGDetailListener {
@Override
@@ -0,0 +1,86 @@
/*
* Copyright (C) 2014 Hippo Seven
*
* 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.hippo.ehviewer.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
public class ResponedScrollView extends ScrollView {
public static final int SCROLL_START = 0x0;
public static final int SCROLL_END = 0x1;
public static final long CHECK_DELAY = 100L;
private boolean isPosted = false;
private int mLastScrollY;
private OnScrollStateChangedListener mListener;
public ResponedScrollView(Context context) {
super(context);
}
public ResponedScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ResponedScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setOnScrollStateChangedListener(OnScrollStateChangedListener l) {
mListener = l;
}
private void wakeScrollObserver() {
mLastScrollY = getScrollY();
postDelayed(mScrollObserver, CHECK_DELAY);
isPosted = true;
}
@Override
@SuppressLint("ClickableViewAccessibility")
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP && !isPosted) {
wakeScrollObserver();
if (mListener != null)
mListener.onScrollStateChanged(this, SCROLL_START);
}
return super.onTouchEvent(ev);
}
private final Runnable mScrollObserver = new Runnable() {
@Override
public void run() {
int newScrollY = getScrollY();
if(newScrollY == mLastScrollY) {
isPosted = false;
if (mListener != null)
mListener.onScrollStateChanged(ResponedScrollView.this, SCROLL_END);
} else {
wakeScrollObserver();
}
}
};
public interface OnScrollStateChangedListener {
public void onScrollStateChanged(ResponedScrollView view, int state);
}
}