У меня два занятия; один — IntermediateActivity
, а другой — активность DragAndDrop
. IntermediateActivity
имеет 5-секундный таймер, а переменная visitcount
увеличивается при каждом открытии IntermediateActivity
. По истечении таймера открывается действие DragAndDrop
, в котором пользователь должен перетащить круг в нужное положение, и когда пользователь может это сделать, я запускаю намерение, которое снова открывает IntermediateActivity
.
При запуске DragAndDrop
при открытии IntermediateActivity
количество посещений увеличивается на 2 вместо одного.
Вот как я вызываю намерение для IntermediateActivity
в DragAndDrop
Activity :
public class DragAndDrop extends AppCompatActivity implements View.OnTouchListener{
private ImageView img;
private ImageView img_outline;
private ViewGroup rootLayout;
private int _xDelta;
private int _yDelta;
@SuppressLint("ClickableViewAccessibility")
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
List<Integer> givenList = Arrays.asList(0, 1, 2, 3);
Random rand = new Random();
int randomElement = givenList.get(rand.nextInt(givenList.size()));
// Randomise location of Circle
switch (randomElement){
case 0:
setContentView(R.layout.bottom_left);
rootLayout = (ViewGroup) findViewById(R.id.bottom_left_layout);
img = (ImageView) rootLayout.findViewById(R.id.circle_bottomLeft);
img_outline = findViewById(R.id.circle_outline_bottomLeft);
break;
case 1:
setContentView(R.layout.bottom_right);
rootLayout = (ViewGroup) findViewById(R.id.bottom_right_layout);
img = (ImageView) rootLayout.findViewById(R.id.circle_bottomRight);
img_outline = findViewById(R.id.circle_outline_bottomRight);
break;
case 2:
setContentView(R.layout.top_left);
rootLayout = (ViewGroup) findViewById(R.id.top_left_layout);
img = (ImageView) rootLayout.findViewById(R.id.circle_topleft);
img_outline = findViewById(R.id.circle_outline_topleft);
break;
case 3:
setContentView(R.layout.top_right);
rootLayout = (ViewGroup) findViewById(R.id.top_right_layout);
img = (ImageView) rootLayout.findViewById(R.id.circle_topRight);
img_outline = findViewById(R.id.circle_outline_topRight);
break;
}
img.setOnTouchListener(this);
}
public void check_success(){
float centreX = img.getX() + img.getWidth() / 2;
float centreY = img.getY() + img.getHeight() / 2;
float centreX_outline = img_outline.getX() + img_outline.getWidth() / 2;
float centreY_outline = img_outline.getY() + img_outline.getHeight() / 2;
// Location Range for 150 x 150dp square with center = center of outline
if((centreX >= centreX_outline-75) &&(centreX <= centreX_outline+75)
&& (centreY >= centreY_outline-75) &&(centreY <= centreY_outline+75)){
// Vibrate
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
v.vibrate(500);
}
// Start Intermediate Activity
Intent i = new Intent(DragAndDrop.this, IntermediateActivity.class);
startActivity(i);
}
}
public boolean onTouch(View view, MotionEvent event) {
check_success();
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
//Drag Functionality
ViewGroup.MarginLayoutParams marginParams = new ViewGroup.MarginLayoutParams(img.getLayoutParams());
int left = (int) event.getRawX() - (view.getWidth() / 2);
int top = (int) event.getRawY() - (view.getHeight());
marginParams.setMargins(left, top, 0, 0);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
img.setLayoutParams(layoutParams);
break;
}
rootLayout.invalidate();
return true;
}
}
А вот код для IntermediateActivity
, в котором переменнаяvisitCount
отслеживает количество вызовов активности:
private TextView footer_text;
private TextView timer_text;
public int timer_counter;
static int visitCount = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intermediate_screen);
timer_text = findViewById(R.id.timer);
footer_text = findViewById(R.id.footer);
timer_counter = 5;
Resources resource = getResources();
if (resource.getConfiguration().locale.getLanguage() == "hi") {
footer_text.setText("कार्य की पूर्णता : " + String.valueOf(visitCount) + "/30");
} else {
footer_text.setText("Tasks completed: " + String.valueOf(visitCount) + "/30");
}
visitCount++;
if (visitCount == 31) {
visitCount = 0;
Intent k = new Intent(IntermediateActivity.this, MainActivity.class);
startActivity(k);
} else {
new CountDownTimer(5000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
timer_text.setText(String.valueOf(timer_counter));
timer_counter--;
}
@Override
public void onFinish() {
i = new Intent(IntermediateActivity.this, DragAndDrop.class);
startActivity(i);
}
}.start();
}
}
Я пытался просмотреть код несколько раз, но не мог понять, почему счетчик увеличивается несколько раз, даже если намерение отправляется только один раз.
Это кажется более вероятным для
onTouch()
, который вызывает несколько разcheck_success()
, и некоторые из этих событий вызывают многократное выполнение действия, даже если оно уже открыто. Вы пытались переместитьcheck_success()
в другое место?Мне нужно
check_success()
, чтобы постоянно проверять, находится ли круг в желаемом положении или нет, где еще я могу его разместить, чтобы сделать это?Кроме того, вы можете попробовать добавить launchMode в свой манифест для IntermediateActivity, например
singleInstance
илиsingleTop
, возможно, последний может стереть счетчик, также вы можете использовать общие настройки для сохранения счетчика.Глядя на код, вы можете переместить
check_success()
внутрьACTION_UP
, то есть когда пользователь перестанет касаться, а Круг уже был перемещен.Это работает, большое спасибо!! Я также попытаюсь интегрировать ваши предыдущие предложения, еще раз спасибо!
Красиво, рад помочь :)