android ViewFlipper制作,OnGestureListener手势监听不灵敏问题

把 ABAP 经验装进 GitHub Copilot 的按需大脑,Agent Skills 如何改变 ABAP 开发 2026 年 8 月,SAP Community 上出现了一次很有代表性的 ABAP 实验。开发者把标准 Flight Model 里的复制成自己的测试类,删除原有 ABAP Unit Test,再让 GitHub Copilot Agent 为方法重新生成测试代码。真正有意思的地方并不是 Copilot 会不会写,而是开发者给 Copilot 准备了两个专门的 Agent Skills,一个负责 ABAP Unit Test 的通用规则,一个负责 ABAP Test Double Framework。 阅读详情

 

项目须有需要做一个新功能引导采用了ViewFlipper,做好后,发现滑动很不灵敏,有时候可以滑动,有时候滑动不了,特别是滑动得快的时候,基本滑动不了。

 

 

太奇怪了,之前做过这个东西是完全没问题的。

 

 

经调试,发现OnGestureListener 接口的方法经常监听不到。

 

 

上网查了会,发现应该是焦点被抢了,所以经常才没反应,

 

 

看源码:

 

 

 

package com.lordcard.ui;

import game.card.dizhu.R;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.app.NotificationManager;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;

import com.cnzz.mobile.android.sdk.MobileProbe;
import com.google.gson.reflect.TypeToken;
import com.lordcard.common.bean.DataCentreBean;
import com.lordcard.common.exception.CrashApplication;
import com.lordcard.common.mydb.DBHelper;
import com.lordcard.common.net.HttpUtils;
import com.lordcard.common.pay.SDKFactory;
import com.lordcard.common.task.GenericTask;
import com.lordcard.common.task.base.TaskParams;
import com.lordcard.common.task.base.TaskResult;
import com.lordcard.common.upgrade.UpdateService;
import com.lordcard.common.upgrade.UpdateUtils;
import com.lordcard.common.util.ActivityPool;
import com.lordcard.common.util.ActivityUtils;
import com.lordcard.common.util.DateUtil;
import com.lordcard.common.util.DialogUtils;
import com.lordcard.common.util.EncodeUtils;
import com.lordcard.common.util.ImageUtil;
import com.lordcard.common.util.JsonHelper;
import com.lordcard.common.util.PatternUtils;
import com.lordcard.constant.Constant;
import com.lordcard.constant.Database;
import com.lordcard.entity.GameUser;
import com.lordcard.entity.JsonResult;
import com.lordcard.entity.MessageCenter;
import com.lordcard.entity.NoticesVo;
import com.lordcard.net.http.HttpRequest;
import com.lordcard.net.http.HttpURL;
import com.lordcard.network.http.GetHttpCache;
import com.lordcard.ui.base.BaseActivity;
import com.lordcard.ui.base.FastJoinTask;
import com.lordcard.ui.base.ILoginView;
import com.lordcard.ui.dizhu.DoudizhuRoomListActivity;
import com.lordcard.ui.view.dialog.AccountBindDialog;
import com.lordcard.ui.view.dialog.ChangeAccountDialog;
import com.lordcard.ui.view.dialog.GameDialog;

@SuppressLint({ "HandlerLeak", "DefaultLocale", "SimpleDateFormat", "WorldReadableFiles" })
public class LoginActivity extends BaseActivity implements ILoginView, OnTouchListener, OnGestureListener {
	private TextView accountTv, goldTv; // 账号,智豆
	private Button loginBtn, changeAccountBtn, bindAccountBtn, quickMatch, quickLogin, updateBtn;
	private AccountBindDialog mAccountBindDialog;// 绑定账号对话框
	private SharedPreferences sharedPrefrences;
	private SharedPreferences sharedViewfiper;
	private Editor editor;
	public static final String KEY_USER = "user_key";
	public static final int UPDATE_USER = 10;
	public static final int RESIGSTER_USER = 20;
	// 登录的时候需要的几个常量
	public final static String ACCOUNT = "account";
	public final static String PASSWORD = "userPwd";
	private RelativeLayout gameBg = null;
	private RelativeLayout katong, loginBg = null;
	private ChangeAccountDialog mChangeAccountDialog = null;
	private TextView zhezhao;
	// 是否更新支付数据
	private RelativeLayout ggdetaiLayout;
	private TextView titleView, contentView, timeView, textName, textTeam;
	private static Boolean boolean1;
	private static int i;
	private static int PXZ, PX_MST, PX_LAST_MST;
	private TextView t1;
	private Timer timer;
	private ScrollView scrollView;
	private Button gonggao;
	private boolean ToastIsShow = false;//土司弹出过(避免土司重复弹出,霸占屏幕)
	private GenericTask rjoinTask;
	public static DBHelper dbHelper;
	private GestureDetector mGestureDetector = null;
	private ViewFlipper mViewFlipper;
	private boolean isShown;
	private int[] imageId = new int[] { R.drawable.login_guide1, R.drawable.login_guide2, R.drawable.login_guide3 };
	private Handler handler = new Handler() {

		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case UPDATE_USER: // 更新界面账户
				if (Database.USER != null) {
					// 优先使用绑定账号
					String account = Database.USER.getAccount();
					if (!TextUtils.isEmpty(Database.USER.getRelaAccount())) {
						account = Database.USER.getRelaAccount();
					}

					accountTv.setText(account); // 账号
					goldTv.setText(PatternUtils.changeZhidou(Database.USER.getBean()));// 智豆
				}
				break;
			case RESIGSTER_USER://注册账号
				register(true);
				break;
			case 1:
				PXZ = PXZ + PX_MST;
				LayoutParams lp = (LayoutParams) t1.getLayoutParams();
				lp.height = PXZ;
				t1.setLayoutParams(lp);
				i = i + 1;
				break;
			case 2:
				PXZ = PXZ - PX_MST;
				LayoutParams lp2 = (LayoutParams) t1.getLayoutParams();
				lp2.height = PXZ;
				t1.setLayoutParams(lp2);
				i = i - 1;
				break;
			case 3:
				scrollView.setVisibility(View.VISIBLE);
				gonggao.setClickable(true);
				break;
			case 4:
				ggdetaiLayout.setVisibility(View.GONE);
				gonggao.setClickable(true);
				break;
			default:
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置标题栏不显示
		overridePendingTransition(R.anim.fade, R.anim.hold);
		setContentView(R.layout.game_login);
		mGestureDetector = new GestureDetector(this);
		initView(); // 初始化View控件
		i = 1;
		PXZ = 0;
		PX_MST = mst.adjustYIgnoreDensity(13);//公告每段高度
		PX_LAST_MST = PX_MST * 20;//高度总高度
		t1 = (TextView) findViewById(R.id.t1);
		timer = new Timer();
		boolean1 = true; //公告标志
		ToastIsShow = false;//土司弹出标志
		dbHelper = new DBHelper(CrashApplication.getInstance());
		GenericTask gameNoticeTask = new GameNoticeTask();
		gameNoticeTask.execute();
		taskManager.addTask(gameNoticeTask);
		new Thread() {
			public void run() {
				try {
					Database.PAYTYPE = SDKFactory.getPayType();
					HttpRequest.getConfig(Database.PAYTYPE);
					SDKFactory.UpdatePayDate();//获取是否更新支付
					SDKFactory.getPayDate();// 拿缓存的支付内容或者更新
				} catch (Exception e) {
				}
			};
		}.start();
		final Timer timer = new Timer(true);
		timer.schedule(new TimerTask() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				if (Database.USER != null) {
					try {
						getGameMessage();
					} catch (Exception e) {
						// TODO: handle exception
					}
					timer.cancel();
				}
			}
		}, 100, 100);

		login(false); // 登录
		mst.adjustView(gameBg);
	}

	@Override
	public void onBackPressed() {
		NotificationManager notificationManager = (NotificationManager) getSystemService(android.content.Context.NOTIFICATION_SERVICE);
		notificationManager.cancel(UpdateService.NOTIFICATION_ID);// 多次下载的
		UpdateUtils.stopDownLoadNewVesionSev(this);
		ActivityPool.exitApp();
	}

	/**
	 * 初始化view控件
	 */
	private void initView() {

		mViewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
		sharedViewfiper = getSharedPreferences("viewflipper", MODE_WORLD_READABLE);
		isShown = sharedViewfiper.getBoolean("flipper", false);
		if (!isShown) {
			mViewFlipper.setVisibility(View.VISIBLE);
			for (int i = 0; i < imageId.length; i++) {
				ImageView mImageView = new ImageView(this);
				mImageView.setBackgroundDrawable(ImageUtil.getResDrawable(imageId[i], false));
				mImageView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
				mViewFlipper.addView(mImageView);
			}
		}

		mChangeAccountDialog = new ChangeAccountDialog(this, handler);
		mAccountBindDialog = new AccountBindDialog(this, handler);
		updateBtn = (Button) findViewById(R.id.update);
		updateBtn.setOnClickListener(mOnClickListener);
		loginBtn = (Button) findViewById(R.id.game_login_in);
		loginBtn.setOnClickListener(mOnClickListener);
		quickMatch = (Button) findViewById(R.id.game_quick_match);
		quickMatch.setOnClickListener(mOnClickListener);
		quickLogin = (Button) findViewById(R.id.game_quick_login);
		quickLogin.setOnClickListener(mOnClickListener);
		changeAccountBtn = (Button) findViewById(R.id.game_login_change_account);
		changeAccountBtn.setOnClickListener(mOnClickListener);
		bindAccountBtn = (Button) findViewById(R.id.game_login_bind_account);
		bindAccountBtn.setOnClickListener(mOnClickListener);

		accountTv = (TextView) findViewById(R.id.game_login_id);
		goldTv = (TextView) findViewById(R.id.game_login_gold);
		accountTv.setText("游客"); // 账号
		goldTv.setText("20000"); // 智豆

		gameBg = (RelativeLayout) findViewById(R.id.layout);
		gameBg.setBackgroundDrawable(ImageUtil.getResDrawable(R.drawable.join_bj, false));

		katong = (RelativeLayout) findViewById(R.id.katong);
		katong.setBackgroundDrawable(ImageUtil.getResDrawable(R.drawable.katong, true));

		titleView = (TextView) findViewById(R.id.gg_title);
		contentView = (TextView) findViewById(R.id.gg_content);
		timeView = (TextView) findViewById(R.id.gg_time);
		textName = (TextView) findViewById(R.id.gg_name);
		textTeam = (TextView) findViewById(R.id.gg_team);

		ggdetaiLayout = (RelativeLayout) findViewById(R.id.gg_detail);
		scrollView = (ScrollView) findViewById(R.id.room_list_scrollView);
		gonggao = (Button) findViewById(R.id.gonggao);
		gonggao.setOnClickListener(mOnClickListener);
		loginBg = (RelativeLayout) findViewById(R.id.login_bg);
		loginBg.setBackgroundDrawable(ImageUtil.getResDrawable(R.drawable.loginbj, true));

	}

	@Override
	public void onResume() {
		super.onResume();
		if (Database.USER != null) {
			String account = Database.USER.getAccount();
			if (!TextUtils.isEmpty(Database.USER.getRelaAccount())) {
				account = Database.USER.getRelaAccount();
			}
			ToastIsShow = false;
			accountTv.setText(account); // 账号
			goldTv.setText(PatternUtils.changeZhidou(Database.USER.getBean())); // 智豆
		}
	}

	private synchronized void login(boolean isLogin) {
		Database.LOGIN_TIME = DateUtil.formatTimesTampDate(new Date());
		GameUser localUser = ActivityUtils.loadLocalAccount();//加载最近登录账号
		if (localUser != null) {
			GameUser userCache = GetHttpCache.readLoginCache(localUser.getAccount() + KEY_USER);
			if (userCache != null) {
				accountTv.setText(userCache.getAccount()); // 账号
				goldTv.setText(PatternUtils.changeZhidou(userCache.getBean())); // 智豆
			}
		}
		if (localUser == null) { // MAC注册新账号
			register(isLogin);
		} else { // 本地账号登录
			// 登录游戏
			GenericTask loginTask = new LoginTask();
			if (isLogin) {
				loginTask.setFeedback(feedback);
			}
			TaskParams params = new TaskParams();
			params.put(ACCOUNT, localUser.getAccount());
			params.put(PASSWORD, localUser.getMd5Pwd());
			loginTask.execute(params);
			taskManager.addTask(loginTask);
		}
	}

	/**
	 * 注册 账号
	 */
	private void register(boolean isLogin) {
		GenericTask registerTask = new RegisterTask();
		if (isLogin) {
			registerTask.setFeedback(feedback);
		}
		registerTask.execute();
		taskManager.addTask(registerTask);
	}

	/**
	 * 登录跳转
	 * 
	 * @param gameUser
	 */
	private void userLogin(final GameUser gameUser) {
		Database.USER = gameUser;
		Database.ROOM_FRESH_TIME = Database.USER.getRoomTime();
		Database.GAME_SERVER = Database.USER.getGameServer();
		GetHttpCache.saveLoginCache(gameUser.getAccount() + KEY_USER, gameUser);//缓存用户信息

		Database.USER.setRound(0);
		Database.SIGN_KEY = gameUser.getAuthKey();

		SharedPreferences sharedData = getApplication().getSharedPreferences(Constant.GAME_ACTIVITE, Context.MODE_PRIVATE);
		Editor editor = sharedData.edit();
		editor.putString(ACCOUNT, gameUser.getAccount());
		editor.commit();

		runOnUiThread(new Runnable() {
			public void run() {
				// 优先使用绑定账号
				String account = gameUser.getAccount();
				if (!TextUtils.isEmpty(gameUser.getRelaAccount())) {
					account = gameUser.getRelaAccount();
				}
				accountTv.setText(account); // 账号
				goldTv.setText(PatternUtils.changeZhidou(gameUser.getBean())); // 智豆
			}
		});
	}
	
	OnClickListener mOnClickListener=new OnClickListener() {
		@Override
		public void onClick(View v) {
			if (mViewFlipper.getVisibility() != View.VISIBLE) {
				switch (v.getId()) {
				case R.id.gonggao:
					MobileProbe.onEvent(LoginActivity.this, "公告", 1L);
					gonggao.setClickable(false);
					if (boolean1 == false) {
						scrollView.setVisibility(View.GONE);
						timer.scheduleAtFixedRate(new TimerTask() {

							@Override
							public void run() {
								if (i <= 20 && i >= 1) {
									handler.sendEmptyMessage(2);
								} else {
									PXZ = 0;
									i = 1;
									this.cancel();
									timer.scheduleAtFixedRate(new TimerTask() {


										@Override
										public void run() {
											handler.sendEmptyMessage(4);
											this.cancel();
										}
									}, 500l, 30l);

								}

							}
						}, 0l, 30l);
						boolean1 = true;
					} else {
						gonggao.setClickable(false);
						ggdetaiLayout.setVisibility(View.VISIBLE);
						timer.scheduleAtFixedRate(new TimerTask() {

							@Override
							public void run() {
								if (i >= 1 && i <= 20) {
									handler.sendEmptyMessage(1);
								} else {
									PXZ = PX_LAST_MST;
									i = 20;
									handler.sendEmptyMessage(3);

									this.cancel();
								}

							}
						}, 0l, 30l);
						boolean1 = false;
					}
					break;
				case R.id.game_login_in:// 游戏大厅
					MobileProbe.onEvent(LoginActivity.this, "游戏大厅", 1L);
					if (Database.USER == null) {
						login(true);
					} else {
						Intent intent = new Intent();
						intent.setClass(LoginActivity.this, DoudizhuRoomListActivity.class);
						startActivity(intent);
					}
					break;
				case R.id.game_login_change_account:// 切换账号
					MobileProbe.onEvent(LoginActivity.this, "切换账号", 1L);
					if (null != mChangeAccountDialog && !mChangeAccountDialog.isShowing()) {
						mChangeAccountDialog = new ChangeAccountDialog(LoginActivity.this, handler);
						mChangeAccountDialog.show();
					}
					break;
				case R.id.game_login_bind_account:// 绑定账号
					MobileProbe.onEvent(LoginActivity.this, "绑定账号D", 1L);
					if (Database.USER == null) {
						login(true);
					} else {
						if (!mAccountBindDialog.isShowing()) {
							mAccountBindDialog.show();
							mAccountBindDialog.initView();
						}
					}
					break;
				case R.id.game_quick_match://参加 比赛
					MobileProbe.onEvent(LoginActivity.this, "快速比赛", 1L);
					if (Database.USER == null) {
						login(true);
					} else {
						Bundle bundle = new Bundle();
						bundle.putInt("page", 2);
						Intent intent = new Intent();
						intent.setClass(LoginActivity.this, DoudizhuRoomListActivity.class);
						intent.putExtras(bundle);
						startActivity(intent);
					}
					break;
				case R.id.game_quick_login:// 快速游戏
					MobileProbe.onEvent(LoginActivity.this, "快速游戏D", 1L);
					FastJoinTask.fastJoin();
					break;
				case R.id.update:// 升级游戏
					if (Database.UPDATED) {
						UpdateUtils.newVersionTip();
						//				UpdateUtils.updateTip(null, false, UPVersion.infolis, "更新内容如下:", this, true);
					} else {
						if (!ToastIsShow) {
							DialogUtils.mesToastTip("您当前已经是最新版本,暂时无需更新!");
							ToastIsShow = true;
						}
					}
					break;
				default:
					break;
				}
			}
		}
	};


	/**
	 * 登录游戏 com.lordcard.ui.LoginTask
	 * 
	 * @author Administrator <br/>
	 *         create at 2013 2013-4-8 下午4:17:56
	 */
	private class LoginTask extends GenericTask {

		protected TaskResult _doInBackground(TaskParams... params) {
			try {
				TaskParams param = null;
				if (params.length <= 0) {
					return TaskResult.FAILED;
				}
				param = params[0];
				// 登录
				String loginPwd = param.getString(PASSWORD);
				if (loginPwd.length() < 30) { //长度大于30则认为当前密码是保存的密文
					loginPwd = EncodeUtils.MD5(loginPwd);
				}
				String result = HttpRequest.login(param.getString(ACCOUNT), loginPwd);
				if (TextUtils.isEmpty(result)) {
					return TaskResult.FAILED;
				}
				JsonResult jsonResult = JsonHelper.fromJson(result, JsonResult.class);
				if (JsonResult.SUCCESS.equals(jsonResult.getMethodCode())) {
					String gameUserJson = jsonResult.getMethodMessage();
					Log.i("gameUserJson", "登录gameUserJson: " + gameUserJson);
					GameUser gameUser = JsonHelper.fromJson(gameUserJson, GameUser.class);

					String account = gameUser.getAccount();
					if (!TextUtils.isEmpty(gameUser.getRelaAccount())) {
						account = gameUser.getRelaAccount();
					}
					ActivityUtils.saveAccount(account, gameUser.getMd5Pwd());
					userLogin(gameUser);

					String roomTime = Database.USER.getRoomTime();
					if (roomTime != null) {
						Database.ROOM_UPDATE = roomTime;
					}
				} else {
					mesTip(jsonResult.getMethodMessage(), false, false);
					return TaskResult.FAILED;
				}
			} catch (Exception e) {
				return TaskResult.FAILED;
			}
			return TaskResult.OK;
		}
	}

	/**
	 * 注册账号 com.lordcard.ui.LoginTask
	 * 
	 * @author Administrator <br/>
	 *         create at 2013 2013-4-8 下午4:17:56
	 */
	private class RegisterTask extends GenericTask {

		protected TaskResult _doInBackground(TaskParams... params) {
			try {
				// 注册
				String result = HttpRequest.register();
				if (TextUtils.isEmpty(result)) {
					return TaskResult.FAILED;
				}
				JsonResult jsonResult = JsonHelper.fromJson(result, JsonResult.class);
				if (JsonResult.SUCCESS.equals(jsonResult.getMethodCode())) {
					String gameUserJson = jsonResult.getMethodMessage();
					GameUser gameUser = JsonHelper.fromJson(gameUserJson, GameUser.class);
					//保存注册账号和密码
					String account = gameUser.getAccount();
					if (!TextUtils.isEmpty(gameUser.getRelaAccount())) {
						account = gameUser.getRelaAccount();
					}
					ActivityUtils.saveAccount(account, gameUser.getMd5Pwd());
					ActivityUtils.saveAccount(account, gameUser.getMd5Pwd());
					Log.i("saveLoginAccount", "登录界面》注册》账户:" + gameUser.getAccount() + "密码:" + gameUser.getMd5Pwd());
					userLogin(gameUser);
				} else {
					DialogUtils.mesTip(jsonResult.getMethodMessage(), false);
				}
			} catch (Exception e) {
				return TaskResult.FAILED;
			}
			return TaskResult.OK;
		}
	}

	/**
	 * 游戏公告信息
	 */
	private class GameNoticeTask extends GenericTask {

		protected TaskResult _doInBackground(TaskParams... params) {
			try {
				String result = HttpUtils.post(HttpURL.GAME_NOTICE_URL, null);
				if (TextUtils.isEmpty(result)) {
					return TaskResult.FAILED;
				}
				final NoticesVo notices = JsonHelper.fromJson(result, NoticesVo.class);

				SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
				Date dt = format.parse(notices.getCtime());
				format = new SimpleDateFormat("yyyy-MM-dd");
				final String time1 = format.format(dt);
				final String content1 = notices.getContent();// 获取的公告内容
				sharedPrefrences = getSharedPreferences("account_ban", MODE_WORLD_READABLE);
				final String time2 = sharedPrefrences.getString("time", null);
				//				final String content2 = sharedPrefrences.getString("content", null);// 保存的公告内容

				runOnUiThread(new Runnable() {
					public void run() {

						ggdetaiLayout.setOnClickListener(null);
						ggdetaiLayout.setVisibility(View.VISIBLE);

						if (time1.equals(time2)) {
							ggdetaiLayout.setVisibility(View.GONE);
							titleView.setText(notices.getTitle());
							contentView.setText("    " + notices.getContent());
							timeView.setText(time1);
							textName.setText("尊敬的玩家:");
							textTeam.setText("千千游运营团队");
							boolean1 = true;
							// mSignDialog.show();
						} else {
							boolean1 = false;
							ggdetaiLayout.setVisibility(View.VISIBLE);
							titleView.setText(notices.getTitle());
							contentView.setText("    " + notices.getContent());
							timeView.setText(time1);
							textName.setText("尊敬的玩家:");
							textTeam.setText("千千游运营团队");
							editor = sharedPrefrences.edit();
							editor.putString("content", content1);
							editor.putString("time", time1);
							editor.commit();
							timer.schedule(new TimerTask() {
								@Override
								public void run() {
									if (i <= 20 && i >= 0) {
										handler.sendEmptyMessage(1);
									} else {
										i = 20;
										PXZ = PX_LAST_MST;
										handler.sendEmptyMessage(3);

										this.cancel();
									}
								}
							}, 2000l, 30l);
						}
					}
				});

			} catch (Exception e) {
				return TaskResult.FAILED;
			}
			return TaskResult.OK;
		}
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		//		mst.unRegisterView(gameBg);
		recyleDrawable();
		timer.cancel();

		if (rjoinTask != null) {
			rjoinTask.cancel(true);
			rjoinTask = null;
		}

	}

	public void recyleDrawable() {
		RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout);
		layout.removeAllViews();
	}

	private void mesTip(final String msg, final boolean showCancel, final boolean isFinish) {
		try {
			Database.currentActivity.runOnUiThread(new Runnable() {
				public void run() {
					GameDialog gameDialog = new GameDialog(Database.currentActivity, showCancel) {
						public void okClick() {
							if (isFinish) {
								ActivityUtils.finishAcitivity();
							}
							if (null != mChangeAccountDialog && !mChangeAccountDialog.isShowing()) {
								mChangeAccountDialog = new ChangeAccountDialog(LoginActivity.this, handler);
								mChangeAccountDialog.show();
							}
						}
					};
					gameDialog.show();
					gameDialog.setText(msg);
				}
			});

		} catch (Exception e) {
		}
	}

	/**
	 * 游戏公告推送插入数据库
	 */
	private void getGameMessage() {
		Database.MESSAGE_CENTER = JsonHelper.fromJson(HttpRequest.getGameData(), new TypeToken<List<MessageCenter>>() {
		});
		if (Database.MESSAGE_CENTER != null && Database.MESSAGE_CENTER.size() > 0 && Database.MESSAGE_CENTER.get(0) != null) {
			for (int i = 0; i < Database.MESSAGE_CENTER.size(); i++) {
				ContentValues values3 = new ContentValues();
				String id;
				if (Database.MESSAGE_CENTER.get(i).getType() == 0) {
					values3.put(DataCentreBean.DATA_ID, Database.MESSAGE_CENTER.get(i).getId() + "0");
					id = Database.MESSAGE_CENTER.get(i).getId() + "0";
				} else {
					values3.put(DataCentreBean.DATA_ID, Database.MESSAGE_CENTER.get(i).getId() + "1");
					id = Database.MESSAGE_CENTER.get(i).getId() + "1";
				}
				values3.put(DataCentreBean.DATA_CONTENT, Database.MESSAGE_CENTER.get(i).getContent());
				values3.put(DataCentreBean.DATA_RACE, Database.MESSAGE_CENTER.get(i).getType());
				values3.put(DataCentreBean.DATA_TIME, Database.MESSAGE_CENTER.get(i).getCtime());
				values3.put(DataCentreBean.DATA_CLICK, "0");
				values3.put(DataCentreBean.DATA_TITLE, Database.MESSAGE_CENTER.get(i).getTitle());
				String[] ids = { id };
				DataCentreBean.getInstance().save(dbHelper, values3, ids);
			}
		}
	}

	@Override
	public boolean onDown(MotionEvent arg0) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
		Log.d("forTag", " onFling : ");
		if (!isShown) {
			if (e1.getX() - e2.getX() > 30) {// 向右滑动

				if (mViewFlipper.getDisplayedChild() == imageId.length - 1) {
					mViewFlipper.setVisibility(View.GONE);
					Editor editor = sharedViewfiper.edit();
					editor.putBoolean("flipper", true);
					editor.commit();
				} else {
					mViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
					mViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
					mViewFlipper.showNext();
					return true;
				}
			} else if (e2.getX() - e1.getX() > 30) {// 向左滑动
				if (mViewFlipper.getDisplayedChild() == 0) {
					Toast.makeText(this, "亲,已经是第一张了", 500).show();
				} else {
					mViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
					mViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
					mViewFlipper.showPrevious();
					return true;
				}
			}
		}
		return true;
	}

	@Override
	public void onLongPress(MotionEvent arg0) {}

	@Override
	public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
		Log.d("forTag", " onScroll : ");
		return false;
	}

	@Override
	public void onShowPress(MotionEvent arg0) {
		Log.d("forTag", " onShowPress : ");
	}

	@Override
	public boolean onSingleTapUp(MotionEvent arg0) {
		Log.d("forTag", " onSingleTapUp : ");
		return false;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		Log.d("forTag", " onTouchEvent : ");
		return this.mGestureDetector.onTouchEvent(event);
	}

	@Override
	public boolean onTouch(View arg0, MotionEvent event) {
		// TODO Auto-generated method stub
		return this.mGestureDetector.onTouchEvent(event);
	}

	//	public boolean onTouch(View view, MotionEvent event) {
	//		return this.mGestureDetector.onTouchEvent(event);
	//	}
}

 

问题是ViewFlipper抢了焦点了,焦点穿不下去,解决办法是,把ViewFlipper的焦点传递下去:

 

 

 

 

		mViewFlipper.setOnTouchListener(new android.view.View.OnTouchListener() {
			@Override
			public boolean onTouch(View arg0, MotionEvent event) {
				return mGestureDetector.onTouchEvent(event);
			}
		});
		mViewFlipper.setOnClickListener(new android.view.View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				return;
			}
		});
工业-实时数据采集 在主节点使用Flume采集/data_log目录下实时日志文件中的数据,将数据存入到Kafka的Topic 中(Topic名称分别为ChangeRecord、ProduceRecord和EnvironmentData,分区数为4),Flume 采集ChangeRecord。 阅读详情

相关推荐

YOLOv11火焰识别:从环境搭建到GUI部署的完整工程实践

目标检测是计算机视觉的核心任务之一,它通过定位和分类图像中的物体,为机器赋予“看懂”世界的能力。其原理通常基于深度学习模型,如YOLO系列,通过卷积神经网络提取特征并预测边界框与类别。这项技术的价值在于将算法能力转化为实际生产力,广泛应用于安防监控、工业质检、自动驾驶等场景。在工程实践中,环境配置的稳定性与数据质量往往决定项目成败,而模型部署的易用性直接影响最终用户体验。本文以火焰识别这一具体应用为切入点,详细解析了如何利用YOLOv11完成从零到产品化的全链路流程,其中涉及Conda虚拟环境管理、PyTo

weixin_29483277的博客 236

android ViewFlipper制作,OnGestureListener手势监听不灵敏问题

项目须有需要做一个新功能引导采用了ViewFlipper,做好后,发现滑动很不灵敏,有时候可以滑动,有时候滑动不了,特别是滑动得快的时候,基本滑动不了。 太奇怪了,之前做过这个东西是完全没问题的。 经调试,发现OnGestureListener 接口的方法经常监听不到。 上网查了会,发现应该是焦点被抢了,所以经常才没反应, 看源码: package com.lordcard.ui;

许集贤 3019

Android应用之【巧妙隐藏桌面图标的进阶方案】

本文详细探讨了Android应用中隐藏桌面图标的进阶方案,解决了传统方法在Android 10及以上版本中出现的黑色图标残留问题。通过Intent-Filter配置和厂商适配技巧,实现子应用真正隐身,同时确保主应用正常启动。适用于企业工具套件、模块化系统等场景,提升用户体验和安全性。

weixin_28363123的博客 511

view的onTouch事件不响应MOVE,up的解决办法

如果要监听手势,一般会想到onTouch,但是我们发现View的onTouch事件只是相应action-down。 原因:onTouch中return false。 解决办法:1, return true 2、在xml布局里加上  android:longClickable="true" 这两者并不完全是等价的。 return true就意味着该view会继续处理抬起事件,而

tanqiantot的专栏 1万+

如何处理MIGO取消物料凭证报错:“只是可能对有相同的价格控制进行倒记账(本月S,前月V)” & “仅在 QM 中修改物料质量检验库存”

记录一次处理MM模块的报错。这次连续处理了两个错误,“只是可能对有相同的价格控制进行倒记账(本月S,前月V)” & “仅在 QM 中修改物料质量检验库存”。把过程和操作步骤记录下一。方便日后回头查找。

IT小职员 6232

Xilinx Aurora 8B/10B IP核详解和仿真

Xilinx Aurora 8b/10b IP核的详解,以及使用与仿真示例,对IP核的配置和如何仿真有非常详细的说明,除了对IP核官方文档的内容进行了解析以外,还对GTX引脚的选择等比较容易混淆和不好理解的地方进行了说明。最后对IP核的仿真运行进行了STEP BY STEP 的说明,对仿真的结果也进行了简要的说明。 该文档对Xilinx FPGA和ZYNQ SOC下 AURORA 8B/10B IP核的使用提供了一个快速上手的指导。

weixin_43354598的博客 1万+

android中的划屏事件 GestureDetector.OnGestureListener 详解(二)

按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。 抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。 长按(onLongPress): 手指按在持续一段时间,并且没有松开。 滚动(onScroll): 手指在触摸屏上滑动。 按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。

Geek Nero 2004

【Android】汽车电源管理:深入解析CarPowerManager与Suspend To RAM的交互机制

本文深入解析了Android Automotive OS中CarPowerManager与Suspend To RAM(深度睡眠)的交互机制。详细阐述了从车辆发出睡眠请求,到CarPowerManagementService协调应用状态,最终通过内核进入低功耗睡眠的完整流程,并探讨了唤醒机制、开发者实践及功耗优化策略,为车机应用开发与系统优化提供关键指导。

weixin_28339967的博客 292

android 手势监听不到,【Android】从无到有:手把手一步步教你自定义RecyclerView手势监听...

【前言】2、本文可以实现GestureDetector 类的全部手势操作方法,包括onSingleTapUp、onLongPress、onScroll、onFling、onShowPress、onDown、onDoubleTap、onDoubleTapEvent、onSingleTapConfirmed、onContextClick。【构造自定义监听器】1、新建RecyclerItemCli...

weixin_35810012的博客 570

YoloV10改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。改进方法简单高效,需要发论文的同学不要错过!

m0_47867638的博客 1097

luks-磁盘加密工具

linux磁盘加密配置工具及步骤详解

zdd56789的博客 121

8 ① AddGesture 保存自定义增加的手势

------------------------------------main.java--------------------- package com.example.addgesture; import android.app.AlertDialog; import android.content.DialogInterface; import android.co

u010919133的专栏 455

正确解决Authentication plugin ‘caching _sha2_password’ cannot be loaded:异常的有效解决方法

正确解决Authentication plugin ‘caching _sha2_password’ cannot be loaded:异常的有效解决方法

wbajsjhhhhh的博客 1万+

安卓作业----慕课移动应用开发作业12之利用ViewFlipper+GestureDetector事件监听,实现手势滑动查看图片

本博客运用GridView、ViewFlipper、ImageView等进行界面布局,使用自定义适配器显示图片。通过GestureDetector事件监听,可手势滑动查看图片,并设置图片左右滑动出、入的效果。 同时这也是中国大学慕课移动终端应用开发的网课作业12,我会持续更新我的作业,如果有需要关注一下吧 说明 1.图片资源来自于阿里巴巴矢量图标库 2.部分内容参考了此篇博客 3.注意版本和And...

baidu_41860619的博客 1643

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ViewFlipper使用详解

前言:今天,试用期绩效考核通过了,从C++转到android还是很有难度的,这几个月来虽然一直在学习,但相比他们还是差很多,没关系,没有人是一下生就会的,知识总是慢慢积累出来的,只是不停下来,总有一天会到达彼岸,我相信,我能行! 梦想还是要有的,万一实现了呢——阿里IPO 一、基本实现 ViewFlipper是一个切换控件,一般用于图片的切换,当然它是可以添加View的,而不限定...

启舰 3万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android ViewFlipper的使用

看一下类的继承结构,我们可以明白很多。 java.lang.Object    ↳ android.view.View      ↳ android.view.ViewGroup        ↳ android.widget.FrameLayout          ↳

极致的专注 无限的热情 4208

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

andorid 使用手势监听器GestureDetector遇到的不响应问题

做了一个项目,首页是使用ResideMenu实现,通过菜单栏里的菜单项创建的Fragment;所以一个Activtiy里就包含多个Fragment,想通过手势也能侧滑,就不用点击菜单按钮打开menu了; 方法如下:在activity的oncreate()中初始化手势监听器 mGestureDetector = new GestureDetector(getApplicationCon

louyxlovess的博客 2487

Android中ViewFlipper详解

前面已经讲过ImageSwitcher和TextSwitcher。ImageSwitcher用来切换ImageView的,TextSwitcher是用来切换TextView的。 但是我们现在要切换自定义View怎么办? ImageSwitcher和TextSwitcher已经不能满足我们的需求。ViewFlipper可以在任意View之间切换。下面我们就来讲解它。 先看一下结构图 可以...

mmdev 395

GestureDetector手势监听不到滑动事件(onFling,onScroll)

在做可以左右的imageview的时候,自定义ImageView重写onTouchEvent,交给GestureDetector处理手势, 然后发现onDown()方法可以执行,但是滑动事件始终不执行。 解决办法就是把默认的onDown()方法重写,返回ture就可以,让事件继续往下传递。代码如下。 package cn.sccl.app.iss.familyalbum.album; im...

caobin_study的博客 4667

Android如何实现轮播效果:ViewFlipper 和 ViewAnimator

现在的app中基本上都有轮播的需求,比如广告banner、最新消息tips等等。 其中我们熟悉的顶部广告一般左右轮播,这种情况大部分通过ViewPager实现。而那种上下轮播的消息tips(一般是条状)则可以使用ViewFlipper实现。 说到ViewFlipper,就不得不先说ViewAnimator,它是ViewFlipper的父类,ViewFlipper的功能就是在它基础上扩展出来的。

star_nwe的博客 1061

android 手势监听案例

class MyGestureListener implements GestureDetector.OnGestureListener { @Override public boolean onDown(MotionEvent e) { /** *如果手势监听不起作用,这里要定义为true ...

景兄弟的博客 1344

Android不同层次的手势监听

Android不同层次的触摸事件监听,无论哪个层次都要记得处理手势的拦截与被拦截,如何强制防止拦截,与释放

happylishang的专栏 2588

Android爬坑记录——GestureDetector无效

Android爬坑记录——GestureDetector无效 很多小伙伴在第一次使用手势监听的时候,肯定会遇到GestureDetector无效的情况,那么究竟是为什么呢?我们直接来看谷歌官方文档 Whether or not you use GestureDetector.OnGestureListener, it’s best practice to implement an onDown()...

catzifeng的博客 3004

ViewFlipper常见小问题

包括与click事件冲突、与Activity生命周期的关系

chivalrous 279

Android 中 ViewFlipper、AdapterViewFlipper使用

公告轮播效果,ViewFlipper、AdapterViewFlipper使用对比

周平的博客 3042
上一篇: android ViewPager,ViewFlipper,ViewFlow实现左右滑动
下一篇: Android 实现多页界面左右滑动切换效果之进阶
codingbuddy
博客等级 码龄14年 4粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值