提交 6e32198a 编写于 作者: 门心叼龙's avatar 门心叼龙

map touch add

上级 bbb7351f
......@@ -33,13 +33,13 @@ public class MainActivity extends AppCompatActivity {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.v(TAG,"MainActivity dispatchTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
Log.v(TAG,"MainActivity isTouchTransView start:"+MotionEventUtil.getMotionEventName(ev));
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.v(TAG,"MainActivity onTouchEvent start:"+MotionEventUtil.getMotionEventName(event));
Log.v(TAG,"MainActivity isTouchTransView start:"+MotionEventUtil.getMotionEventName(event));
return super.onTouchEvent(event);
}
}
package com.android.touchevent;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import com.android.touchevent.util.BlogViewController;
import com.android.touchevent.util.DisplayUtil;
import com.android.touchevent.view.BlogMapView;
import com.android.touchevent.view.BlogTransView;
import com.android.touchevent.view.TransScrollView;
import com.android.touchevent.view.BlogScrollView;
public class MapTouchActivity extends AppCompatActivity {
public static final String TAG = MapTouchActivity.class.getSimpleName();
private RelativeLayout mLayoutBlogRoot;
private BlogMapView mBlogMapView;
private BlogTransView mBlogTransView;
private TransScrollView mTransScrollView;
private BlogScrollView mBlogScrollView;
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -27,15 +32,103 @@ public class MapTouchActivity extends AppCompatActivity {
setSupportActionBar(toolbar);
mBlogMapView = findViewById(R.id.blog_map_view);
mBlogTransView = findViewById(R.id.view_blog_trans);
mTransScrollView = findViewById(R.id.view_scrollview);
mBlogScrollView = findViewById(R.id.view_scrollview);
mLayoutBlogRoot = findViewById(R.id.layout_blog_root);
mBlogMapView.onCreate(savedInstanceState);
BlogViewController mBlogViewController = new BlogViewController(mLayoutBlogRoot, mBlogMapView, mTransScrollView, mBlogTransView);
mBlogViewController.init();
init();
}
public void init() {
//设置BlogScrollView的透明部分的监听器
mBlogScrollView.setTransViewTouchListener(new BlogTransView.OnTouchEventListener() {
@Override
public boolean isTouchTransView(MotionEvent event) {
return mBlogTransView.isTouchTransView(event);
}
});
//设置透明的view的事件分发器
mBlogTransView.setDispatchEventListener(new BlogTransView.DispatchEventListener() {
@Override
public boolean dispathTouchEvent(MotionEvent event) {
//直接把事件分发给BlogMapView
return mBlogMapView.dispatchMapTouchEvent(event);
}
});
//设置透明view里放大,缩小按钮的监听器
mBlogTransView.setBtnZoomChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//如果不是人手动点击则返回
if (!compoundButton.isPressed()) {
return;
}
//把BlogTransView状态设置给MapView的CheckBox
mBlogMapView.setBtnMapZoomChecked(b);
}
});
//设置地图放大按钮的回调监听,进行地图展开和缩小的操作
mBlogMapView.setChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//开始展开,收缩的操作
setFlexWindow(isChecked);
}
});
}
//设置弹性窗口true:展开;false:收缩
private void setFlexWindow(boolean b) {
//当为true的时候:1.ScrollView要往下移动,是一个位移动画;
//当为false的时候:1.ScrollView要往上移动,是一个位移动画;
//往下移动,要移动多少?其实就是整个内容区域的高度,也就是layoutRoot的高度,恢复高度为0即可
//MapView要缩放,要放大到多少倍?其他就是layoutRoot的高度除以MapView的高度
//计算MapView的高度
Rect rect = new Rect();
mBlogTransView.getLocalVisibleRect(rect);
int mMapViewHeight = DisplayUtil.dip2px(250);
//不判断将是个大Bug
if (rect.height() < mMapViewHeight - DisplayUtil.dip2px(30)) {
mBlogTransView.setBtnMapZoomChecked(!b);
mBlogMapView.setBtnMapZoomChecked(!b);
return;
}
Log.v(TAG, "mapview height:" + mMapViewHeight);
//计算整个内容区域的高度
int mRootHeight = mLayoutBlogRoot.getHeight();
Log.v(TAG, "rootlayout height:" + mRootHeight);
int offset = mRootHeight - mMapViewHeight;
Log.v(TAG, "offset height:" + offset);
Log.v(TAG, "scrollview width:" + mBlogScrollView.getWidth() + ";height:" + mBlogScrollView.getHeight() + ";x:" + mBlogScrollView.getX() + ";y:" + mBlogScrollView.getY());
if (b) {
expendAnimator(mMapViewHeight, mRootHeight, offset);
} else {
expendAnimator(mRootHeight, mMapViewHeight, 0);
}
}
private void expendAnimator(int mMapViewHeight, int mRootHeight, int offset) {
//创建ScrollView向下移动移动
ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(mBlogScrollView, "translationY", offset);
//创建地图放大动画
ValueAnimator valueAnimator = ValueAnimator.ofInt(mMapViewHeight, mRootHeight);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int animatedValue = (int) valueAnimator.getAnimatedValue();
Log.v(TAG, "map height:" + animatedValue);
mBlogMapView.setMapLayoutParams(animatedValue);
}
});
//合成两个动画效果
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(translateAnimator).with(valueAnimator);
animatorSet.setDuration(1000);
animatorSet.start();
}
}
package com.android.touchevent.util;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.graphics.Rect;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import com.android.touchevent.view.BlogMapView;
import com.android.touchevent.view.BlogTransView;
import com.android.touchevent.view.TransScrollView;
/**
* Description: <View协调控制器><br>
* Author: gxl<br>
* Date: 2019/1/25<br>
* Version: V1.0.0<br>
* Update: <br>
*/
public class BlogViewController {
public static final String TAG = BlogViewController.class.getSimpleName();
private RelativeLayout mLayoutBlogRoot;
private BlogMapView mBlogMapView;
private TransScrollView mTransScrollView;
private BlogTransView mBlogTransView;
public BlogViewController(RelativeLayout layoutBlogRoot, BlogMapView blogMapView, TransScrollView transScrollView, BlogTransView blogTransView) {
mLayoutBlogRoot = layoutBlogRoot;
mBlogMapView = blogMapView;
mTransScrollView = transScrollView;
mBlogTransView = blogTransView;
}
public void init() {
mBlogTransView.setListener(new BlogTransView.TouchEventListener() {
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return mBlogMapView.dispatchMapTouchEvent(event);
}
});
mBlogTransView.setBtnMapZoomOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//如果不是人手动点击则返回
if (!compoundButton.isPressed()) {
return;
}
mBlogMapView.setBtnMapZoomChecked(b);
setFlexWindow(b);
}
});
mTransScrollView.setListener(new BlogTransView.TouchEventListener() {
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Rect rect = new Rect();
mBlogTransView.getLocalVisibleRect(rect);
if (rect.contains((int) event.getX(), (int) event.getY())) {
return true;
} else {
return false;
}
}
});
}
//设置弹性窗口true:展开;false:收缩
private void setFlexWindow(boolean b) {
//当为true的时候:1.ScrollView要往下移动,是一个位移动画;
//当为false的时候:1.ScrollView要往上移动,是一个位移动画;
//往下移动,要移动多少?其实就是整个内容区域的高度,也就是layoutRoot的高度,恢复高度为0即可
//MapView要缩放,要放大到多少倍?其他就是layoutRoot的高度除以MapView的高度
//计算MapView的高度
Rect rect = new Rect();
mBlogTransView.getLocalVisibleRect(rect);
int mMapViewHeight = DisplayUtil.dip2px(250);
//不判断将是个大Bug
if (rect.height() < mMapViewHeight - DisplayUtil.dip2px(30)) {
mBlogTransView.setBtnMapZoomChecked(!b);
mBlogMapView.setBtnMapZoomChecked(!b);
return;
}
Log.v(TAG, "mapview height:" + mMapViewHeight);
//计算整个内容区域的高度
int mRootHeight = mLayoutBlogRoot.getHeight();
Log.v(TAG, "rootlayout height:" + mRootHeight);
int offset = mRootHeight - mMapViewHeight;
Log.v(TAG, "offset height:" + offset);
Log.v(TAG, "scrollview width:" + mTransScrollView.getWidth() + ";height:" + mTransScrollView.getHeight() + ";x:" + mTransScrollView.getX() + ";y:" + mTransScrollView.getY());
if (b) {
expendAnimator(mMapViewHeight, mRootHeight, offset);
} else {
expendAnimator(mRootHeight, mMapViewHeight, 0);
}
}
private void expendAnimator(int mMapViewHeight, int mRootHeight, int offset) {
//创建ScrollView向下移动移动
ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(mTransScrollView, "translationY", offset);
//创建地图放大动画
ValueAnimator valueAnimator = ValueAnimator.ofInt(mMapViewHeight, mRootHeight);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int animatedValue = (int) valueAnimator.getAnimatedValue();
Log.v(TAG, "map height:" + animatedValue);
mBlogMapView.setMapLayoutParams(animatedValue);
}
});
//合成两个动画效果
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(translateAnimator).with(valueAnimator);
animatorSet.setDuration(1000);
animatorSet.start();
}
}
......@@ -6,8 +6,8 @@ import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import com.amap.api.maps.AMap;
import com.amap.api.maps.TextureMapView;
import com.android.touchevent.R;
......@@ -24,6 +24,7 @@ public class BlogMapView extends RelativeLayout {
private AMap mMap;
private TextureMapView mTextureMapView;
private CheckBox mBtnMapZoom;
private CompoundButton.OnCheckedChangeListener mChangeListener;
public BlogMapView(Context context, AttributeSet attrs) {
super(context, attrs);
......@@ -33,6 +34,14 @@ public class BlogMapView extends RelativeLayout {
mMap.getUiSettings().setZoomControlsEnabled(false);
mBtnMapZoom = findViewById(R.id.btn_map_zoom);
mBtnMapZoom.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (mChangeListener != null) {
mChangeListener.onCheckedChanged(compoundButton, b);
}
}
});
}
public boolean dispatchMapTouchEvent(MotionEvent event) {
......@@ -45,32 +54,18 @@ public class BlogMapView extends RelativeLayout {
}
public void setBtnMapZoomChecked(boolean b) {
if (mBtnMapZoom != null) {
mBtnMapZoom.setChecked(b);
}
mBtnMapZoom.setChecked(b);
}
public void onCreate(Bundle bundle) {
mTextureMapView.onCreate(bundle);
}
public void onResume() {
mTextureMapView.onResume();
}
public void onSaveInstanceState(Bundle outState) {
mTextureMapView.onSaveInstanceState(outState);
}
public void onPause() {
mTextureMapView.onPause();
}
public void onDestroy() {
mTextureMapView.onDestroy();
}
public AMap getMap() {
return mMap;
}
public void setChangeListener(CompoundButton.OnCheckedChangeListener changeListener) {
mChangeListener = changeListener;
}
}
......@@ -14,22 +14,25 @@ import android.view.MotionEvent;
* Version: V1.0.0<br>
* Update: <br>
*/
public class TransScrollView extends NestedScrollView {
public BlogTransView.TouchEventListener mListener;
public class BlogScrollView extends NestedScrollView {
public BlogTransView.OnTouchEventListener mTouchEventListener;
public TransScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
public BlogScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mListener != null && mListener.dispatchTouchEvent(ev)) {
//如果触摸的是透明BlogTransView,那么该事件继续往下分发给BlogScrollView的子View:BlogTransView
if (mTouchEventListener != null && mTouchEventListener.isTouchTransView(ev)) {
//返回false表示继续往下层View树进行分发
return false;
}
//否则就调用ScrollView的拦截事件,进行滚动处理
return super.onInterceptTouchEvent(ev);
}
public void setListener(BlogTransView.TouchEventListener listener) {
mListener = listener;
//设置透明View的触摸事件监听器
public void setTransViewTouchListener(BlogTransView.OnTouchEventListener listener) {
mTouchEventListener = listener;
}
}
......@@ -22,14 +22,17 @@ import com.android.touchevent.R;
*/
public class BlogTransView extends RelativeLayout {
public static final String TAG = BlogTransView.class.getSimpleName();
private BlogTransView.TouchEventListener mListener;
private CheckBox mBtnMapZoom;
private CompoundButton.OnCheckedChangeListener mChangeListener;
public interface TouchEventListener {
boolean dispatchTouchEvent(MotionEvent event);
private CompoundButton.OnCheckedChangeListener mBtnZoomChangeListener;
private DispatchEventListener mDispatchEventListener;
//是否被触摸的监听器
public interface OnTouchEventListener {
boolean isTouchTransView(MotionEvent event);
}
//透明View的事件分发监听器
public interface DispatchEventListener {
boolean dispathTouchEvent(MotionEvent event);
}
public BlogTransView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.view_blog_trans, this, true);
......@@ -37,42 +40,57 @@ public class BlogTransView extends RelativeLayout {
mBtnMapZoom.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (mChangeListener != null) {
mChangeListener.onCheckedChanged(compoundButton, b);
if (mBtnZoomChangeListener != null) {
mBtnZoomChangeListener.onCheckedChanged(compoundButton, b);
}
}
});
}
//如果触摸了ScrollView上半部分的透明的部分,则事件会分发至此
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (mListener != null) {
if (mDispatchEventListener != null) {
Rect rect = new Rect();
mBtnMapZoom.getHitRect(rect);
Log.v(TAG, "x:" + event.getX() + ";y:" + event.getY());
//如果用户点击了放大,缩小按钮则该事件会继续往下分发给他的子View:CheckBox
if (rect.contains((int) event.getX(), (int) event.getY())) {
Log.v(TAG, "mBtnMapZoom click yes");
return super.dispatchTouchEvent(event);//继续往下分发给CheckBox
} else {
Log.v(TAG, "mBtnMapZoom click no");
return mListener.dispatchTouchEvent(event);
return mDispatchEventListener.dispathTouchEvent(event);
}
} else {
return super.dispatchTouchEvent(event);
}
}
public void setListener(BlogTransView.TouchEventListener listener) {
mListener = listener;
public void setBtnZoomChangeListener(CompoundButton.OnCheckedChangeListener listener) {
mBtnZoomChangeListener = listener;
}
public void setBtnMapZoomOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener) {
mChangeListener = listener;
}
public void setBtnMapZoomChecked(boolean b) {
if (mBtnMapZoom != null) {
mBtnMapZoom.setChecked(b);
}
}
public boolean isTouchTransView(MotionEvent event){
Rect rect = new Rect();
getLocalVisibleRect(rect);
//根据坐标来判断,是否是点击了透明View,如果是则返回true,否则返回false
if (rect.contains((int) event.getX(), (int) event.getY())) {
return true;
} else {
return false;
}
}
public void setDispatchEventListener(DispatchEventListener dispatchEventListener) {
mDispatchEventListener = dispatchEventListener;
}
}
......@@ -25,13 +25,13 @@ public class MyButton extends Button {
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.v(TAG,"MyButton dispatchTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
Log.v(TAG,"MyButton isTouchTransView start:"+MotionEventUtil.getMotionEventName(ev));
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.v(TAG,"MyButton onTouchEvent start:"+MotionEventUtil.getMotionEventName(event));
Log.v(TAG,"MyButton isTouchTransView start:"+MotionEventUtil.getMotionEventName(event));
return super.onTouchEvent(event);
}
}
......@@ -24,7 +24,7 @@ public class MyLayout extends LinearLayout {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.v(TAG,"MyLayout dispatchTouchEvent start:"+MotionEventUtil.getMotionEventName(ev));
Log.v(TAG,"MyLayout isTouchTransView start:"+MotionEventUtil.getMotionEventName(ev));
return super.dispatchTouchEvent(ev);
}
......@@ -36,7 +36,7 @@ public class MyLayout extends LinearLayout {
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.v(TAG,"MyLayout onTouchEvent start:"+MotionEventUtil.getMotionEventName(event));
Log.v(TAG,"MyLayout isTouchTransView start:"+MotionEventUtil.getMotionEventName(event));
return super.onTouchEvent(event);
}
}
......@@ -28,7 +28,7 @@
/>
<com.android.touchevent.view.TransScrollView
<com.android.touchevent.view.BlogScrollView
android:id="@+id/view_scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
......@@ -234,6 +234,6 @@
/>
</LinearLayout>
</LinearLayout>
</com.android.touchevent.view.TransScrollView>
</com.android.touchevent.view.BlogScrollView>
</RelativeLayout>
</LinearLayout>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册