添加 ResponedScrollView
This commit is contained in:
1 parent
90d95c6552
commit
d0e1b4cfee
8 files changed
+215
-68
No files matched your search
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user