package com.xiaomi.xms.sales.activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.LinearLayout; import com.xiaomi.xms.sales.R; import com.xiaomi.xms.sales.ui.BaseWebFragment; import com.xiaomi.xms.sales.util.Constants; import com.xiaomi.xms.sales.util.Device; import com.xiaomi.xms.sales.util.LogUtil; import com.xiaomi.xms.sales.widget.gallery.GestureDetector; public class CampaignActivity extends BaseActivity { public static final String BOTTOM_STYLE_BUTTON = "button"; public static final String BOTTOM_STYLE_BAR = "bar"; public static final String BOTTOM_STYLE_NONE = "none"; private BaseWebFragment mCampainFragment; private View mActivityContainer; private LinearLayout mBottom; private ImageView mBottomScrollBar; private LinearLayout mBottomScrollButton; private GestureDetector mGestrueDetector; private boolean mFinishAnim; private String mCurrentBottomStyle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCustomContentView(R.layout.campaign_activity); mActivityContainer = findViewById(R.id.container); mCampainFragment = (BaseWebFragment) getSupportFragmentManager().findFragmentById( R.id.campaign_fragment); mBottom = (LinearLayout) findViewById(R.id.activity_bottom); mBottomScrollBar = (ImageView) findViewById(R.id.activity_bottom_scroll_bar); mBottomScrollButton = (LinearLayout) findViewById(R.id.activity_bottom_scroll_button); mGestrueDetector = new GestureDetector(this, new MyGestureListener(), null, true); handleIntent(getIntent()); mBottom.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return mGestrueDetector.onTouchEvent(event); } }); mBottom.setOnClickListener(new OnClickListener() { private static final int JUMPED_HEIGHT = 60; @Override public void onClick(View v) { if (BOTTOM_STYLE_BAR.equals(mCurrentBottomStyle)) { mActivityContainer.scrollBy(0, JUMPED_HEIGHT); new Handler().postDelayed(new Runnable() { @Override public void run() { mActivityContainer.scrollBy(0, -JUMPED_HEIGHT); } }, 100); } else if (BOTTOM_STYLE_BUTTON.equals(mCurrentBottomStyle)) { finish(); } } }); } private void handleIntent(Intent intent) { if (intent.getBooleanExtra(Constants.Intent.EXTRA_CAMPAIGN_SHOW_TITLE, true)) { showTitleBar(null); } else { hideTitleBar(); } String bottomStyle = intent.getStringExtra(Constants.Intent.EXTRA_CAMPAIGN_SHOW_BOTTOM); setBottomBarStyle(TextUtils.isEmpty(bottomStyle) ? BOTTOM_STYLE_NONE : bottomStyle); mFinishAnim = intent.getBooleanExtra(Constants.Intent.EXTRA_CAMPAIGN_FINISH_ANIM, false); String url = intent.getStringExtra(Constants.Intent.EXTRA_COMPAIGN_URL); if (!TextUtils.isEmpty(url)) { showWebView(url); } else { finish(); } } @Override public void finish() { runOnUiThread(new Runnable() { @Override public void run() { CampaignActivity.super.finish(); if (mFinishAnim) { overridePendingTransition(R.anim.campaign_disappear_enter, R.anim.campaign_disappear_exit); } else { overridePendingTransition(R.anim.activity_close_enter, R.anim.activity_close_exit); } } }); } @Override public void onNewIntent(Intent intent) { setIntent(intent); handleIntent(intent); } private void showWebView(String url) { mCampainFragment.loadUrl(url); } @Override public void onBackPressed() { if (!mCampainFragment.handleBackPressed()) { super.onBackPressed(); } } public void showTitleBar(final String title) { runOnUiThread(new Runnable() { @Override public void run() { setTitleBarEnable(true); if (!TextUtils.isEmpty(title)) { setTitle(title); } } }); } public void hideTitleBar() { runOnUiThread(new Runnable() { @Override public void run() { setTitleBarEnable(false); } }); } public void setBottomBarStyle(final String style) { runOnUiThread(new Runnable() { @Override public void run() { mCurrentBottomStyle = style; if (BOTTOM_STYLE_BAR.equals(style)) { mBottomScrollBar.setVisibility(View.VISIBLE); mBottomScrollButton.setVisibility(View.GONE); } else if (BOTTOM_STYLE_BUTTON.equals(style)) { mBottomScrollBar.setVisibility(View.GONE); mBottomScrollButton.setVisibility(View.VISIBLE); } else if (BOTTOM_STYLE_NONE.equals(style)) { mBottomScrollBar.setVisibility(View.GONE); mBottomScrollButton.setVisibility(View.GONE); } } }); } public static void startActivityWithAnimation(BaseActivity context, String url) { Intent intent = new Intent(context, CampaignActivity.class); intent.putExtra(Constants.Intent.EXTRA_COMPAIGN_URL, url); intent.putExtra(Constants.Intent.EXTRA_CAMPAIGN_SHOW_BOTTOM, CampaignActivity.BOTTOM_STYLE_BUTTON); intent.putExtra(Constants.Intent.EXTRA_CAMPAIGN_SHOW_TITLE, false); intent.putExtra(Constants.Intent.EXTRA_CAMPAIGN_FINISH_ANIM, true); context.startActivity(intent); context.overridePendingTransition(R.anim.campaign_appear_enter, R.anim.campaign_appear_exit); } public static void startActivityStandard(BaseActivity context, String url) { Intent intent = getStandardIntentToMe(context, url); context.startActivity(intent); context.overridePendingTransition(R.anim.activity_open_enter, R.anim.activity_open_exit); } public static Intent getStandardIntentToMe(Context context, String url) { Intent intent = new Intent(context, CampaignActivity.class); intent.putExtra(Constants.Intent.EXTRA_COMPAIGN_URL, url); return intent; } private class MyGestureListener extends GestureDetector.SimpleOnGestureListener { private float mPreDistanceY; private int mTotalScrollDistance; @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { LogUtil.d("MyGestureListener", "The distance y is:" + distanceY); if (mPreDistanceY * distanceY > 0) { int distanceYInPixel = (int) (distanceY * 3.2); int totalScrollDistance = mTotalScrollDistance + distanceYInPixel; if (totalScrollDistance < Device.DISPLAY_HEIGHT && totalScrollDistance > 0) { mTotalScrollDistance = totalScrollDistance; mActivityContainer.scrollBy(0, distanceYInPixel); } } mPreDistanceY = distanceY; return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { LogUtil.d("MyGestureListener", "The velocityY is:" + velocityY); if (velocityY < -5000) { finish(); } return true; } @Override public boolean onUp(MotionEvent e) { // 如果滑动举例超过屏幕高度的1/4,那么收起活动页 if (mTotalScrollDistance > (Device.DISPLAY_HEIGHT / 4)) { finish(); final int dis = -mTotalScrollDistance; mHandler.postDelayed(new Runnable() { @Override public void run() { mActivityContainer.scrollBy(0, dis); } }, 1100); } else { // 否则回到起始的位置 mActivityContainer.scrollBy(0, -mTotalScrollDistance); } mTotalScrollDistance = 0; mPreDistanceY = 0; return true; } } }