码迷,mamicode.com
首页 > 其他好文 > 详细

最简单的左右滑动item实现不同效果

时间:2015-05-24 20:26:15      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

一、效果

技术分享

技术分享

二、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都在无效区域,所以系统没有画他们,但是线性布局为何可以呢?这是个问题。

最简单的左右滑动item实现不同效果

标签:

原文地址:http://blog.csdn.net/a910626/article/details/45954365

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!