【发布时间】:2017-08-15 19:26:26
【问题描述】:
我刚刚学会了如何动态创建卡片视图。我正在使用按钮来创建一个卡片视图,并且我已经将 onTouchListener 设置为它。当我只创建一张卡片时,onTouchListener 工作正常,但是一旦我再创建一张卡片,onTouchListener 就无法按预期工作。当我有 2 张卡并尝试移动第一张卡时,它会移动第二张而不是第一张。
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
Context context;
ImageView imageView;
RelativeLayout relativeLayout;
static int pos=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
context=this;
relativeLayout=(RelativeLayout)findViewById(R.id.rl_layout);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
CreateCardViewWithoutImageView();
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
return true;
}
public void CreateCardViewWithoutImageView(){
final CardView cardview=new CardView(context);
cardview.setId(++pos);
cardview.setLayoutParams((new CardView.LayoutParams(600, 600)));
cardview.setContentPadding(25,25,25,25);
cardview.setCardBackgroundColor(Color.MAGENTA);
relativeLayout.addView(cardview);
}
private final View.OnTouchListener mListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View card, MotionEvent event) {
// The View (v) here is a CardView as the onTouchListener is set to it
RelativeLayout.LayoutParams layoutParamsRL = (RelativeLayout.LayoutParams) ((CardView) card).getLayoutParams();
float dx = 0, dy = 0, x = 0, y = 0;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
card.bringToFront();
dx = event.getRawX() - layoutParamsRL.leftMargin;
dy = event.getRawY() - layoutParamsRL.topMargin;
}
break;
case MotionEvent.ACTION_MOVE: {
x = event.getRawX();
y = event.getRawY();
layoutParamsRL.leftMargin = (int) (x - dx);
layoutParamsRL.topMargin = (int) (y - dy);
card.setLayoutParams(layoutParamsRL);
}
break;
case MotionEvent.ACTION_UP: {
}
break;
}
return true;
}
};
}
【问题讨论】: