一、效果
二、item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:id="@+id/item_long"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#FFF"
>
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="china cool"
android:textSize="30sp"
android:textColor="#000"
android:layout_gravity="center_vertical"
/>
<Button
android:id="@+id/btn_delete"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:background="#CFD8DC"
android:textSize="20sp"
android:gravity="center"
android:text="删除"
/>
<Button
android:id="@+id/btn_menu"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:background="#FF3D00"
android:textSize="20sp"
android:gravity="center"
android:text="菜单"
/>
</LinearLayout>
</LinearLayout>
三、activity
package com.qianfeng.gudao.SwipeDemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends Activity implements View.OnTouchListener {
/**
* 需要拉动的内容
*/
private View itemLong;
private Button btnDelete,btnMenu;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
itemLong = findViewById(R.id.item_long);
itemLong.setOnTouchListener(this);
btnDelete = (Button) findViewById(R.id.btn_delete);
btnMenu = (Button) findViewById(R.id.btn_menu);
}
//上一次拖拽的X坐标
private float lastX;
/**
* 这个事件也是处理TouchEvent的事件的
* @param v
* @param event
* @return boolean true 代表事件处理了,false 代表当前没处理
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean b = false;
if (v == itemLong){
int action = event.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
//当使用onTouchListener时,Down这个方法,返回true
//后面的move 才会继续传给这个接口
b = true;
lastX = 0;
break;
case MotionEvent.ACTION_MOVE:
//进行移动
//凡是要实现控件的拖拽,事件的 x,y
//需要使用物理手机屏幕的rawX,rawY才可以进行运算
float rawX = event.getRawX();
if(lastX==0){
lastX = rawX;
}else{
float step = rawX-lastX;
//移动控件
//1.获取原有的位置
int left = itemLong.getLeft();
int btnDeleteWidth = btnDelete.getWidth();
int btnMenuWidth = btnMenu.getWidth();
//2.计算新值
float nl = left+step;
int newLeft = (int) nl;
int maxMove = btnDeleteWidth + btnMenuWidth;
//目的是为了体现出动态的效果
if(newLeft <=0 && newLeft>=-maxMove){
//3.代码动态设置控件的位置
itemLong.setLeft(newLeft);
}
//更新上一次x,确保平滑滚动
lastX = rawX;
}
break;
}
}
return b;
}
}
三、一个问题
如果把布局改成相对布局,就无法显示button,且获得button的宽度也是0,说明button并没有被画出来。可能是因为两个button都在无效区域,所以系统没有画他们,但是线性布局为何可以呢?这是个问题。
时间: 2024-10-02 22:24:54