touch listener
public class MainActivityy extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
permisions=new ArrayList<Boolean>();
ControlApplication myApplication = (ControlApplication) this.getApplicationContext();
db= myApplication.getDatabaseAdapter();
first=true;
lefts=new int[11];
tops=new int[11];
point=new Point();
positions=new ArrayList<Feilds_position>();
//==================calculate width and height display in pixle
DisplayMetrics displayMetrics = getApplicationContext().getResources().getDisplayMetrics();
int dpHeight = (int) (displayMetrics.heightPixels / displayMetrics.density);
int dpWidth = (int) (displayMetrics.widthPixels / displayMetrics.density);
display = getWindowManager().getDefaultDisplay();
width = display.getWidth(); // deprecated
height = display.getHeight();
centerOfwidth=width/2;
centerOfheight=dpHeight/2;
//===================
orientation=getApplicationContext().getResources().getConfiguration().orientation;
if(orientation==1)
{
w=dpWidth/7;
}else
{
w=dpHeight/7;
}
//=========================
widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
//==============================
//************
RelativeLayout.LayoutParams relativeLayoutParams;
LinearLayout.LayoutParams linearLayoutParams;
LinearLayout linLayout_base = new LinearLayout(this);
linLayout_base.setOrientation(LinearLayout.VERTICAL);
linLayout_base.setBackgroundColor(getResources().getColor(R.color.bg));
mLayoutGroup = new AbsoluteLayout(this);
layoutParams = new AbsoluteLayout.LayoutParams(AbsoluteLayout.LayoutParams.MATCH_PARENT,AbsoluteLayout.LayoutParams.MATCH_PARENT, 0, 0);
linLayout_base.addView(mLayoutGroup,layoutParams);
overridePendingTransition(R.anim.pull_in_from_left, R.anim.hold);
LayoutParams linLayoutParam = new LayoutParams(width , height);
setContentView(linLayout_base, linLayoutParam);
btn_reminder= new Button(this);
btn_reminder.setText(R.string.reminder);
btn_reminder.setId(0);
btn_reminder.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.size20));
btn_reminder.measure(widthMeasureSpec, heightMeasureSpec);
widthOfText=btn_reminder.getMeasuredWidth();
btn_reminder.setTextColor(getResources().getColor(R.color.textmenu));
point.x=centerOfwidth+70;
point.y=190;
btn_reminder.setBackgroundResource(R.drawable.btn_round_color8);
loadSavedPreferences(btn_reminder);
btn_reminder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {}
});
btn_reminder.setOnTouchListener(touchListener);
btn_news= new Button(this);
btn_news.setText(getResources().getString(R.string.news));
btn_news.setId(9);
// btn_news.setBackgroundResource(R.drawable.btn_round_color2);
btn_news.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.size20));
btn_news.setTextColor(getResources().getColor(R.color.textmenu));
btn_news.measure(widthMeasureSpec, heightMeasureSpec);
widthOfText=btn_news.getMeasuredWidth();
// point=random_place(width,height);
point.x=centerOfwidth-150;
point.y=290;
btn_news.setBackgroundResource(R.drawable.btn_round_color1);
loadSavedPreferences(btn_news);
btn_news.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {}
});
btn_news.setOnTouchListener(touchListener);
}
OnTouchListener touchListener = new OnTouchListener()
{
int temp[]= new int[]{0, 0};
public boolean onTouch(final View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
if(editable)
{
int eventAction = arg1.getAction();
int x = (int)arg1.getRawX();
int y = (int)arg1.getRawY();
switch (eventAction) {
case MotionEvent.ACTION_DOWN:
temp[0] = (int)arg1.getX();
temp[1] = (int)(y-arg0.getTop());
mLayoutGroup.bringChildToFront(arg0);
arg0.postInvalidate();
break;
case MotionEvent.ACTION_MOVE:
left = x - temp[0];
top = y - temp[1];
right = left + arg0.getWidth();
bottom = top + arg0.getHeight();
if (right > width) {
left=width-arg0.getWidth();
right = width;
}
if (bottom > height) {
top=height-arg0.getHeight();
bottom = height;
}
if (left<0)
{
left=0;
right=arg0.getWidth();
}
if (top < 0) {
bottom=arg0.getHeight();
top = 0;
}
arg0.layout(left, top, right, bottom);
arg0.postInvalidate();
break;
case MotionEvent.ACTION_UP:
if(orientation==1)
{
savePreferencesLeft_port(arg0.getId(),arg0.getLeft());
savePreferencesTop_port(arg0.getId(),arg0.getTop());
}else
{
savePreferencesLeft_land(arg0.getId(),arg0.getLeft());
savePreferencesTop_land(arg0.getId(),arg0.getTop());
}
break;
default:
break;
}
}
if(editable)
return true;
else
return false;
}
};
private void loadSavedPreferences(View view) {
if(orientation==1)
{
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
layoutParams = new AbsoluteLayout.LayoutParams(widthOfText+w, widthOfText+w, sp.getInt("left_port"+view.getId(), point.x), sp.getInt("top_port"+view.getId(), point.y));
}else
{
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
layoutParams = new AbsoluteLayout.LayoutParams(widthOfText+w, widthOfText+w, sp.getInt("left_land"+view.getId(), point.x), sp.getInt("top_land"+view.getId(), point.y));
}
mLayoutGroup.addView(view, layoutParams);
}
private void savePreferencesLeft_port(int id,int value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putInt("left_port"+String.valueOf(id), value);
edit.commit();
}
private void savePreferencesLeft_land(int id,int value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putInt("left_land"+String.valueOf(id), value);
edit.commit();
}
private void savePreferencesTop_port(int id,int value) {
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putInt("top_port"+String.valueOf(id), value);
edit.commit();
}
private void savePreferencesTop_land(int id,int value) {
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putInt("top_land"+String.valueOf(id), value);
edit.commit();
}
}
من صفحه ای را طراحی کرده ام که شامل چند دکمه از نوع Button است،این دکمه ها با انتخاب" دکمه ویرایش " قابل جابجایی و touch هستند در غیر اینصورت قابل کلیک شدن می باشند .موقعیت هر دکمه پس از جابجایی توسط Share preference ذخیره می شود و در دفعات بعدی در همان موقعیت تغییر یافته در دفعه قبل می باشد.
من صفحه ام را کلا بدون Xml و در قسمت کد جاوا طراحی و از Absulote layout استفاده کرده ام.
کا ر من در گوشی هایی با ورژن اندروید 4.3 و مدل های پایین تر به خوبی کار می کند.اما حالا که در یک گوشی با ورژن اندروید 4.4 آن را امتحان می کنم ،می بینم با touch هر دکمه, موقعیت دکمه قبلی که آن را جابجا کرده بودم به جای اول خود بازمیگردد.
جالب اینجاست که وقتی از صفحه خارج شده و دوباره برمیگردم ،چون موقعیت ها را از Share preference می خواند، درست است،اما زمان Touch این پرش وجود دارد.
لطف می کنید اگر کمک کنید تا من مشکل کارم را پیدا کرده و آن را حل کنم
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .