Commit 854c578b authored by leichao.gao's avatar leichao.gao

搜索的过渡动画,以及rxbus

parent 5c2b4c9a
......@@ -136,6 +136,9 @@ dependencies {
implementation("com.google.mlkit:barcode-scanning:17.3.0")
// Use this dependency to use the dynamically downloaded model in Google Play Services
// implementation ("com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1")
// RxJava 3.1.3
implementation("io.reactivex.rxjava3:rxjava:3.1.3")
implementation("io.reactivex.rxjava3:rxandroid:3.0.0")
//facebook
......
package com.base.browserwhite.help;
public class Constants {
public static final String CHANGE_SEARCH_TYPE="change_search_type";
}
package com.base.browserwhite.help;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.PublishSubject;
import io.reactivex.rxjava3.subjects.Subject;
/**
* Created by gaoleichao on 2018/3/26.
*/
public class RxBus {
private static final String TAG = RxBus.class.getSimpleName();
private static RxBus instance;
public final static boolean DEBUG = false;
public static synchronized RxBus get() {
if (null == instance) {
instance = new RxBus();
}
return instance;
}
private RxBus() {
}
private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<>();
public void clear() {
for (Object obj : subjectMapper.keySet()) {
List<Subject> subjects = subjectMapper.get(obj);
if (null != subjects) {
subjects.clear();
}
}
subjectMapper.clear();
}
public boolean isHasObservable(Object tag) {
if (subjectMapper.size() > 0) {
return subjectMapper.get(tag) != null;
}
return false;
}
@SuppressWarnings("unchecked")
public <T> Observable<T> register(@NonNull Object tag, @NonNull Class<T> clazz) {
List<Subject> subjectList = subjectMapper.get(tag);
if (null == subjectList) {
subjectList = new ArrayList<>();
subjectMapper.put(tag, subjectList);
}
Subject<T> subject;
subjectList.add(subject = PublishSubject.create());
return subject;
}
public void unregister(@NonNull Object tag, @NonNull Observable observable) {
List<Subject> subjects = subjectMapper.get(tag);
if (null != subjects) {
subjects.remove(observable);
if (isEmpty(subjects)) {
subjectMapper.remove(tag);
}
if (!observable.subscribe().isDisposed()) {
observable.subscribe().dispose();
}
}
}
public void post(@NonNull Object content) {
post(content.getClass().getName(), content);
}
@SuppressWarnings("unchecked")
public void post(@NonNull Object tag, @NonNull Object content) {
if (subjectMapper == null) {
return;
}
List<Subject> subjectList = subjectMapper.get(tag);
if (!isEmpty(subjectList)) {
for (Subject subject : subjectList) {
if (subject != null) {
subject.onNext(content);
}
}
}
}
public static boolean isEmpty(Collection collection) {
return null == collection || collection.isEmpty();
}
public static boolean isEmpty(Map map) {
return null == map || map.isEmpty();
}
public static boolean isEmpty(Object[] objs) {
return null == objs || objs.length <= 0;
}
public static boolean isEmpty(int[] objs) {
return null == objs || objs.length <= 0;
}
public static boolean isEmpty(CharSequence charSequence) {
return null == charSequence || charSequence.length() <= 0;
}
}
package com.base.browserwhite.ui.activity;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.fragment.app.FragmentManager;
import com.base.browserwhite.MyApplication;
import com.base.browserwhite.R;
import com.base.browserwhite.utils.BarUtils;
import com.google.android.material.appbar.AppBarLayout;
public class SearchActivity extends AppCompatActivity {
@Override
......@@ -37,6 +24,13 @@ public class SearchActivity extends AppCompatActivity {
BarUtils.INSTANCE.setStatusBarLightMode(this, true);
BarUtils.INSTANCE.setStatusBarColor(this, Color.TRANSPARENT);
setContentView(R.layout.activity_search);
ConstraintLayout layout = findViewById(R.id.appbar_layout);
CoordinatorLayout.LayoutParams layoutParams =(CoordinatorLayout.LayoutParams) layout.getLayoutParams();
int finalPosition = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics());
layoutParams.topMargin = BarUtils.INSTANCE.getStatusBarHeight()+finalPosition;
layout.setLayoutParams(layoutParams);
layout.setVisibility(View.VISIBLE);
}
@SuppressLint("MissingSuperCall")
......@@ -48,13 +42,11 @@ public class SearchActivity extends AppCompatActivity {
}
public static void startActivityWithButtonAnimation(Activity currentActivity, View button) {
Log.d("glc","getHeight:"+-button.getHeight());
Log.d("glc","getHeight:"+(-button.getHeight()-32f));
int finalPosition = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48, currentActivity.getResources().getDisplayMetrics());
ObjectAnimator animator = ObjectAnimator.ofFloat(button, "translationY", button.getTranslationY(), -finalPosition);
public static void startActivityWithButtonAnimation(Activity currentActivity, View button,int verticalOffset) {
int finalPosition = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, currentActivity.getResources().getDisplayMetrics());
int buttonTop = button.getTop() - finalPosition;
int distanceToTop = -buttonTop-verticalOffset;
ObjectAnimator animator = ObjectAnimator.ofFloat(button, "translationY", button.getTranslationY(), distanceToTop);
animator.setDuration(500);
animator.addListener(new Animator.AnimatorListener() {
@Override
......@@ -78,7 +70,7 @@ public class SearchActivity extends AppCompatActivity {
public void onAnimationRepeat(Animator animation) {
}
});
animator.start();
}
}
package com.base.browserwhite.ui.fragment
import android.R.attr.button
import android.animation.ObjectAnimator
import android.content.Intent
import android.text.TextUtils
import android.util.Log
import android.view.KeyEvent
import android.view.inputmethod.EditorInfo.IME_ACTION_DONE
import android.widget.TextView
......@@ -29,7 +27,9 @@ import com.base.browserwhite.bean.defaultValue
import com.base.browserwhite.bean.webSiteGroupBeanList
import com.base.browserwhite.databinding.FragmentHomeBinding
import com.base.browserwhite.fcm.NotificationUtil
import com.base.browserwhite.help.Constants
import com.base.browserwhite.help.NewsUtils.requestNews
import com.base.browserwhite.help.RxBus
import com.base.browserwhite.ui.activity.SearchActivity
import com.base.browserwhite.ui.activity.appprocess.AppProcessActivity
import com.base.browserwhite.ui.activity.bookmark.BookmarkActivity
......@@ -57,6 +57,9 @@ import com.base.browserwhite.utils.LogEx
import com.chad.library.adapter4.QuickAdapterHelper
import com.chad.library.adapter4.loadState.LoadState
import com.chad.library.adapter4.loadState.trailing.TrailingLoadStateAdapter
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.functions.Consumer
class HomeFragment : BaseFragment<FragmentHomeBinding>() {
......@@ -73,10 +76,17 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
private var headWebsiteAdapter: HeadWebsiteAdapter? = null
private var searchAction = ::getSpSearchAction
private var searchEngine: String = GOOGLE
private var mChangeSearchType: Observable<String>? = null
override fun setView() {
mChangeSearchType = RxBus.get().register(Constants.CHANGE_SEARCH_TYPE, String::class.java)
mChangeSearchType?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Consumer<String> {
override fun accept(t: String) {
LogEx.logDebug("glc", "i:" + t)
switchSearch(t)
}
})
newsAdapter = NewsAdapter(
clickAction = { url ->
requireContext().startActivity(
......@@ -148,7 +158,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
BookmarkActivity::class.java
)
)
requireContext().startActivity(Intent(requireContext(), BookmarkActivity::class.java))
requireContext().startActivity(
Intent(
requireContext(),
BookmarkActivity::class.java
)
)
}
}
......@@ -172,13 +187,22 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
}
}
binding.appbarLayout.addOnOffsetChangedListener { appBarLayout, i ->
verticalOffset = i
}
y = binding.searchLayout.translationY
binding.editWeb.setOnClickListener {
SearchActivity.startActivityWithButtonAnimation(activity, binding.searchLayout)
SearchActivity.startActivityWithButtonAnimation(
activity,
binding.searchLayout,
verticalOffset
)
}
requestMore()
}
private var verticalOffset = 0
private var y = 0f
fun requestMore() {
isLoading = true
......@@ -255,42 +279,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
binding.flSearchEngine.setOnClickListener {
requireContext().showSearchEngineDialog { website ->
searchEngine = website
searchEngineSp = website
when (website) {
GOOGLE -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_google)
searchAction = ::getGoogleSearch
}
BING -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_bing)
searchAction = ::getBingSearch
}
YAHOO -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_yahoo)
searchAction = ::getYahooSearch
}
DUCKDUCKGO -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_xuckd)
searchAction = ::getDuckDuckGoSearch
}
YANDEX -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_yandex)
searchAction = ::getYandexSearch
}
BAIDU -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_baidu)
searchAction = ::getBaiduSearch
}
}
switchSearch(website)
}
}
......@@ -358,6 +347,44 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
}
private fun switchSearch(website:String){
searchEngine = website
searchEngineSp = website
when (website) {
GOOGLE -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_google)
searchAction = ::getGoogleSearch
}
BING -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_bing)
searchAction = ::getBingSearch
}
YAHOO -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_yahoo)
searchAction = ::getYahooSearch
}
DUCKDUCKGO -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_xuckd)
searchAction = ::getDuckDuckGoSearch
}
YANDEX -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_yandex)
searchAction = ::getYandexSearch
}
BAIDU -> {
binding.ivSearchEngine.setImageResource(R.mipmap.h_s_baidu)
searchAction = ::getBaiduSearch
}
}
}
private fun copyUuidGid() {
val uuid = AppPreferences.getInstance().getString("uuid", "")
val gid = AppPreferences.getInstance().getString("gid", "")
......@@ -365,5 +392,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
Toast.makeText(requireContext(), "copy", Toast.LENGTH_SHORT).show()
}
override fun onDestroy() {
super.onDestroy()
if (mChangeSearchType != null) {
RxBus.get().unregister(Constants.CHANGE_SEARCH_TYPE, mChangeSearchType!!);
}
}
}
\ No newline at end of file
......@@ -26,6 +26,8 @@ import com.base.browserwhite.databinding.DialogMediaMoreBinding
import com.base.browserwhite.databinding.DialogMoreWebbrowserBinding
import com.base.browserwhite.databinding.DialogMyAccountBinding
import com.base.browserwhite.databinding.DialogSearchEngineBinding
import com.base.browserwhite.help.Constants
import com.base.browserwhite.help.RxBus
import com.base.browserwhite.ui.activity.about.AboutActivity
import com.base.browserwhite.ui.activity.feedback.FeedbackActivity
import com.base.browserwhite.ui.views.DialogViews.showDefaultBrowserDialog
......@@ -154,6 +156,7 @@ object DialogViews {
YANDEX -> binding.ivSearchEngine.setImageResource(R.mipmap.m_yandex)
BAIDU -> binding.ivSearchEngine.setImageResource(R.mipmap.m_baidu)
}
RxBus.get().post(Constants.CHANGE_SEARCH_TYPE,searchEngineSp)
}
}
binding.clDefaultBrowser.isVisible = !isDefaultBrowser()
......
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="10"
android:fromAlpha="0.0"
android:fromAlpha="1.0"
android:toAlpha="1.0"></alpha>
......@@ -2,4 +2,4 @@
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="10"
android:fromAlpha="1.0"
android:toAlpha="0.0"></alpha>
\ No newline at end of file
android:toAlpha="1.0"></alpha>
\ No newline at end of file
......@@ -8,9 +8,9 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/appbar_layout"
android:layout_width="match_parent"
android:visibility="gone"
android:layout_height="50dp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="48dp"
android:background="@drawable/bg_stroke_070709"
android:gravity="center"
android:orientation="horizontal">
......
......@@ -17,7 +17,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
app:layout_scrollFlags="scroll|enterAlwaysCollapsed"
tools:ignore="ContentDescription">
......@@ -85,11 +84,17 @@
android:id="@+id/searchLayout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginHorizontal="15dp"
android:background="@drawable/bg_stroke_070709"
android:background="@color/white"
android:layout_marginTop="16dp"
android:gravity="center"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="15dp"
android:background="@drawable/bg_stroke_070709"
tools:ignore="MissingConstraints">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/fl_search_engine"
......@@ -162,7 +167,7 @@
android:src="@mipmap/saoyisao" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment