如何在 Android 中同时为 ImageFlipper 实现 OnClick 和 Sliding 事件
How to implement both OnClick and Sliding events at once for an ImageFlipper in Android
我正在尝试开发具有以下行为的 Android 图像翻转器。
- activity启动时自动开始翻转(翻转
间隔也已实施)。
- 用户还可以在翻转器中向右或向左滑动图像
- 用户应该能够单击特定图像并加载另一个图像
activity
项目 1,我可以毫无问题地成功实施。
问题是,我无法同时实现 2 和 3,因为 imageView.OnClickListner()
总是在触发 Flipper.OnTouch()
Listner 之前先出现。因此,滑动永远不会发生,但新的 activity 会立即加载。
如何在我的 Android 应用程序中同时实现所有 3 个要求?
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_home, container, false);
int sliderImgs[] = {R.drawable.slider_img_1, R.drawable.slider_img_1, R.drawable.slider_img_1};
viewFlipper = root.findViewById(R.id.img_slider);
mContext = this.getContext();
viewFlipper.setAutoStart(true);
viewFlipper.setFlipInterval(20000);
viewFlipper.setInAnimation(this.getContext(), R.anim.slide_in_right);
viewFlipper.setOutAnimation(this.getContext(), R.anim.slide_out_left);
viewFlipper.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(final View view, final MotionEvent event) {
detector.onTouchEvent(event);
return true;
}
});
for(int sliderImg:sliderImgs){
slideshowImages(sliderImg);
}
}
private void slideshowImages(int image){
ImageView imageView = new ImageView(this.getContext());
imageView.setBackgroundResource(image);
viewFlipper.addView(imageView);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
View notificaionFragment = getLayoutInflater().inflate(R.layout.fragment_property_details, null);
BottomSheetDialog bottomSheetDialog = arrangeBottomSheet(notificaionFragment);
new Notification(notificaionFragment, mContext, getLayoutInflater(), bottomSheetDialog);
}
});
}
我所做的是设置一个阈值...我跟踪手指在屏幕上的移动;如果达到一定数量,我将其视为翻转;否则它是单击按钮(或 ImageView,或其他),然后调用 performClick。
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
break;
case MotionEvent.ACTION_UP:
float endX = event.getX();
float endY = event.getY();
//swipe right
if (startX > endX && (startX - endX) > 10.0) {
if (pageIndex < totalPages) {
pageIndex++;
vFlipper.setInAnimation(EventActivity.this, R.anim.transition_in_left);
vFlipper.setOutAnimation(EventActivity.this, R.anim.transition_out_left);
vFlipper.showNext();
}
} else if ((startX - endX) > 0 && (startX - endX) < 10.0) {
v.performClick();
}
float operacion = Math.abs(startX - endX);
if (startX < endX && operacion > 10.0) {
if (pageIndex > 1) {
pageIndex--;
vFlipper.setInAnimation(EventActivity.this, R.anim.transition_in_right);
vFlipper.setOutAnimation(EventActivity.this, R.anim.transition_out_right);
vFlipper.showPrevious();
}
} else if (operacion < 10 && operacion != 0) {
v.performClick();
}
if (startX - endX == 0) {
v.performClick();
}
break;
}
return true;
}
好吧...看看你的实现,我建议你改用 viewPager,它对用户更友好,你可以轻松添加片段或视图,而且不那么棘手。
https://androidwave.com/auto-scroll-viewpager-android/ 看看这个教程,它工作得很好,我用它在我的一个应用程序中实现了自定义 viewPager!
我正在尝试开发具有以下行为的 Android 图像翻转器。
- activity启动时自动开始翻转(翻转 间隔也已实施)。
- 用户还可以在翻转器中向右或向左滑动图像
- 用户应该能够单击特定图像并加载另一个图像 activity
项目 1,我可以毫无问题地成功实施。
问题是,我无法同时实现 2 和 3,因为 imageView.OnClickListner()
总是在触发 Flipper.OnTouch()
Listner 之前先出现。因此,滑动永远不会发生,但新的 activity 会立即加载。
如何在我的 Android 应用程序中同时实现所有 3 个要求?
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_home, container, false);
int sliderImgs[] = {R.drawable.slider_img_1, R.drawable.slider_img_1, R.drawable.slider_img_1};
viewFlipper = root.findViewById(R.id.img_slider);
mContext = this.getContext();
viewFlipper.setAutoStart(true);
viewFlipper.setFlipInterval(20000);
viewFlipper.setInAnimation(this.getContext(), R.anim.slide_in_right);
viewFlipper.setOutAnimation(this.getContext(), R.anim.slide_out_left);
viewFlipper.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(final View view, final MotionEvent event) {
detector.onTouchEvent(event);
return true;
}
});
for(int sliderImg:sliderImgs){
slideshowImages(sliderImg);
}
}
private void slideshowImages(int image){
ImageView imageView = new ImageView(this.getContext());
imageView.setBackgroundResource(image);
viewFlipper.addView(imageView);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
View notificaionFragment = getLayoutInflater().inflate(R.layout.fragment_property_details, null);
BottomSheetDialog bottomSheetDialog = arrangeBottomSheet(notificaionFragment);
new Notification(notificaionFragment, mContext, getLayoutInflater(), bottomSheetDialog);
}
});
}
我所做的是设置一个阈值...我跟踪手指在屏幕上的移动;如果达到一定数量,我将其视为翻转;否则它是单击按钮(或 ImageView,或其他),然后调用 performClick。
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
break;
case MotionEvent.ACTION_UP:
float endX = event.getX();
float endY = event.getY();
//swipe right
if (startX > endX && (startX - endX) > 10.0) {
if (pageIndex < totalPages) {
pageIndex++;
vFlipper.setInAnimation(EventActivity.this, R.anim.transition_in_left);
vFlipper.setOutAnimation(EventActivity.this, R.anim.transition_out_left);
vFlipper.showNext();
}
} else if ((startX - endX) > 0 && (startX - endX) < 10.0) {
v.performClick();
}
float operacion = Math.abs(startX - endX);
if (startX < endX && operacion > 10.0) {
if (pageIndex > 1) {
pageIndex--;
vFlipper.setInAnimation(EventActivity.this, R.anim.transition_in_right);
vFlipper.setOutAnimation(EventActivity.this, R.anim.transition_out_right);
vFlipper.showPrevious();
}
} else if (operacion < 10 && operacion != 0) {
v.performClick();
}
if (startX - endX == 0) {
v.performClick();
}
break;
}
return true;
}
好吧...看看你的实现,我建议你改用 viewPager,它对用户更友好,你可以轻松添加片段或视图,而且不那么棘手。 https://androidwave.com/auto-scroll-viewpager-android/ 看看这个教程,它工作得很好,我用它在我的一个应用程序中实现了自定义 viewPager!