Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 731|回复: 0

Android 左右滑动 控件-  Android学习

[复制链接]

该用户从未签到

发表于 2011-10-24 14:57:59 | 显示全部楼层 |阅读模式
先看效果:



main.xml:
java代码

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        androidrientation="vertical" android:layout_width="fill_parent"

        android:layout_height="fill_parent">

        <TextView android:id="@+id/textView" android:layout_width="fill_parent"

                android:layout_height="wrap_content" android:text="ddd" />

        <com.diydyq.android.swipeTest.SlipView

                android:id="@+id/slipView" android:orientation="vertical"

                android:layout_width="fill_parent" android:layout_height="fill_parent">

        </com.diydyq.android.swipeTest.SlipView>

</LinearLayout>
复制代码



SlipEntity.java
Java代码

package com.iaiai.activity;



import java.util.HashMap;

import java.util.Map;



import android.graphics.Bitmap;

import android.util.Log;



/**

*

* <p>

* Title: SlipEntity.java

* </p>

* <p>

* E-Mail: 176291935@qq.com

* </p>

* <p>

* QQ: 176291935

* </p>

* <p>

* Http: iaiai.iteye.com

* </p>

* <p>

* Create time: 2011-8-11

* </p>

*

* @author 丸子

* @version 0.0.1

*/

public class SlipEntity {

        public static final int FLAG_BACK = 1;

        public static final int FLAG_FROT = 2;

        public static final float DOCK_L = 0;

        public static final float DOCK_M = (float) 0.5;

        public static final float DOCK_R = 1;

        public static final float MICRO_X = 10;

        /** Background image */



        Bitmap backImage;

        /** Front image */

        Bitmap frotImage;

        /** Start Position of back image */

        float xBackStart;

        /** Start Position of back image */

        float yBackStart;

        /** Start Position of front image */

        float xFrotStart;

        /** Start Position of front image */

        float yFrotStart;

        /** initial Position of front image */

        float xFrotInitPos;

        /** initial Position of front image */

        float yFrotInitPos;

        /** Margin of front and back image in X-Axis */

        float xMarginLeft;

        /** Margin of front and back image in Y-Axis */

        float yMarginTop;

        /** Containing dock position of the front image */



        Map<Float, Float> dockPosList = new HashMap<Float, Float>();

        /** Current dock Percentage: DOCK_L | DOCK_M | DOCK_R */

        float curDockPer = DOCK_L;

        /** Weather has invoked initSlipEntity() */

        boolean isInit = false;



        public SlipEntity() {

        }



        public SlipEntity(Bitmap backImage, Bitmap frotImage) {

                this.backImage = backImage;

                this.frotImage = frotImage;

        }



        public SlipEntity(float xBackStart, float yBackStart, float xFrotStart,

                        float yFrotStart) {

                this.xBackStart = xBackStart;

                this.yBackStart = yBackStart;

                this.xFrotStart = xFrotStart;

                this.yFrotStart = yFrotStart;

        }



        public void initSlipEntity(float viewWidth, float viewHeight) {

                this.xBackStart = (viewWidth - this.backImage.getWidth()) / 2;

                this.yBackStart = (viewHeight - this.backImage.getHeight()) / 2;

                this.xMarginLeft = 5;

                this.yMarginTop = (this.backImage.getHeight() - this.frotImage

                                .getHeight()) / 2;

                this.xFrotInitPos = this.xBackStart + this.xMarginLeft;

                this.yFrotInitPos = this.yBackStart + this.yMarginTop;

                this.xFrotStart = this.xFrotInitPos;

                this.yFrotStart = this.yFrotInitPos;

                // Add dock position

                float dockL = this.xFrotInitPos;

                float dockR = this.xBackStart + this.backImage.getWidth()

                                - this.frotImage.getWidth() - this.xMarginLeft;

                this.dockPosList.put(DOCK_L, dockL);

                this.dockPosList.put(DOCK_R, dockR);

                for (Float dockPer : this.dockPosList.keySet()) {

                        if (this.dockPosList.get(dockPer) == 0) {

                                float docPos = (dockR - dockL) * dockPer

                                                + this.dockPosList.get(DOCK_L);

                                this.dockPosList.put(dockPer, docPos);

                        }

                }



                // Dock at current position

                this.xFrotStart = this.dockPosList.get(this.curDockPer);

                this.isInit = true;

                // For debug information

                StringBuilder sb = new StringBuilder();

                sb.append("BackImageW:" + this.backImage.getWidth() + "\n");

                sb.append("BackImageH:" + this.backImage.getHeight() + "\n");

                sb.append("FrotImageW:" + this.frotImage.getWidth() + "\n");

                sb.append("FrotImageH:" + this.frotImage.getHeight() + "\n");

                sb.append("xBackStart:" + xBackStart + "\n");

                sb.append("yBackStart:" + yBackStart + "\n");

                sb.append("xMarginLeft:" + xMarginLeft + "\n");

                sb.append("yMarginTop:" + yMarginTop + "\n");

                sb.append("xFrotInitP:" + xFrotInitPos + "\n");

                sb.append("yFrotInitP:" + yFrotInitPos + "\n");

                sb.append("xFrotStart:" + xFrotStart + "\n");

                sb.append("yFrotStart:" + yFrotStart + "\n");

                Log.v("SlipEntity", sb.toString());

        }



        /**

         * Weather the front image reaches the max right of background image, if

         * true, set xFrotStart to max right.

         *

         * @return

         */

        public boolean isReachRight() {

                if (this.xFrotStart > this.dockPosList.get(DOCK_R)) {

                        this.curDockPer = DOCK_R;

                        this.xFrotStart = this.dockPosList.get(DOCK_R);

                        return true;

                } else {

                        return false;

                }

        }



        /**

         * Weather the front image reaches the max left of background image, if

         * true, set xFrotStart to max left.

         *

         * @return

         */

        public boolean isReachLeft() {

                if (this.xFrotStart < this.dockPosList.get(DOCK_L)) {

                        this.curDockPer = DOCK_L;

                        this.xFrotStart = this.dockPosList.get(DOCK_L);

                        return true;

                } else {

                        return false;

                }

        }



        /**

         * Weather the point(x,y) is in the area of back or front image

         *

         * @param type

         *            FLAG_FROT(front image) | FLAG_BACK(back image)

         * @param x

         *            X-coordinate of point

         * @param y

         *            Y-coordinate of point

         * @return weather the point is in specified area

         */

        public boolean isPointInImage(int type, float x, float y) {

                float rPointX;

                float rPointY;

                switch (type) {

                case FLAG_FROT:

                        rPointX = this.xFrotStart + this.frotImage.getWidth();

                        rPointY = this.yFrotStart + this.frotImage.getHeight();

                        if (x > this.xFrotStart && y > this.yFrotStart && x < rPointX

                                        && y < rPointY)

                                return true;

                        else

                                return false;

                case FLAG_BACK:

                        rPointX = this.xBackStart + this.backImage.getWidth();

                        rPointY = this.yBackStart + this.backImage.getHeight();

                        if (x > this.xBackStart && y > this.yBackStart && x < rPointX

                                        && y < rPointY)

                                return true;

                        else

                                return false;

                default:

                        return false;

                }

        }



        /**

         * Is the current touch in some dock position

         *

         * @return return dockPer if in, or -1 while no match

         */

        public float isDock() {

                for (float dockPer : this.dockPosList.keySet()) {

                        float dockPos = this.dockPosList.get(dockPer);

                        if (this.xFrotStart > dockPos - MICRO_X

                                        && this.xFrotStart < dockPos + MICRO_X) {

                                this.curDockPer = dockPer;

                                return dockPer;

                        }

                }

                return -1;

        }



        /**

         * Get the current dock percentage in x-axis

         *

         * @return

         */

        public float getCurDockPer() {

                return this.curDockPer;

        }



        /**

         * Get the current dock position in x-axis

         *

         * @return

         */

        public float getCurDockPos() {

                return this.dockPosList.get(this.curDockPer);

        }



        /**

         * Add dock position to the list

         *

         * @param dockPer

         *            dock Percent should be between (0.0,1.0)

         */



        public void addDockPos(float dockPer) {

                if (dockPer > 0 && dockPer < 1) {

                        this.dockPosList.put(dockPer, (float) 0.0);

                }

        }



        /**

         * Return width of background image

         *

         * @return

         */



        public float getBackWidth() {

                return this.backImage.getWidth();

        }



        /**

         * Return height of background image

         *

         * @return

         */

        public float getBackHeight() {

                return this.backImage.getHeight();

        }



        /**

         * Return width of front image

         *

         * @return

         */

        public float getFrotWidth() {

                return this.frotImage.getWidth();

        }



        /**

         * Return height of front image

         *

         * @return

         */

        public float getFrotHeight() {

                return this.frotImage.getWidth();

        }



        /**

         * Dock at some position

         *

         * @param curDockPer

         */



        public void setCurDockPos(float curDockPer) {

                this.curDockPer = curDockPer;

        }



        public Bitmap getBackImage() {

                return backImage;

        }



        public void setBackImage(Bitmap backImage) {

                this.backImage = backImage;

        }



        public Bitmap getFrotImage() {

                return frotImage;

        }



        public void setFrotImage(Bitmap frotImage) {

                this.frotImage = frotImage;

        }



        public float getxBackStart() {

                return xBackStart;

        }



        public void setxBackStart(float xBackStart) {

                this.xBackStart = xBackStart;

        }



        public float getyBackStart() {

                return yBackStart;

        }



        public void setyBackStart(float yBackStart) {

                this.yBackStart = yBackStart;

        }



        public float getxFrotStart() {

                return xFrotStart;

        }



        public void setxFrotStart(float xFrotStart) {

                this.xFrotStart = xFrotStart;

        }



        public float getyFrotStart() {

                return yFrotStart;

        }



        public void setyFrotStart(float yFrotStart) {

                this.yFrotStart = yFrotStart;

        }



        public float getxFrotInitPos() {

                return xFrotInitPos;

        }



        public void setxFrotInitPos(float xFrotInitPos) {

                this.xFrotInitPos = xFrotInitPos;

        }



        public float getyFrotInitPos() {

                return yFrotInitPos;

        }



        public void setyFrotInitPos(float yFrotInitPos) {

                this.yFrotInitPos = yFrotInitPos;

        }



        public float getxMarginLeft() {

                return xMarginLeft;

        }



        public void setxMarginLeft(float xMarginLeft) {

                this.xMarginLeft = xMarginLeft;

        }



        public float getyMarginTop() {

                return yMarginTop;

        }



        public void setyMarginTop(float yMarginTop) {

                this.yMarginTop = yMarginTop;

        }



        public Map<Float, Float> getDockPosList() {

                return dockPosList;

        }



        public void setDockPosList(Map<Float, Float> dockPosList) {

                this.dockPosList = dockPosList;

        }



        public boolean isInit() {

                return isInit;

        }



        public void setInit(boolean isInit) {



                this.isInit = isInit;

        }

}
复制代码



SlipView.java
Java代码

package com.iaiai.activity;



import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.drawable.BitmapDrawable;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;



/**

*

* <p>

* Title: SlipView.java

* </p>

* <p>

* E-Mail: 176291935@qq.com

* </p>

* <p>

* QQ: 176291935

* </p>

* <p>

* Http: iaiai.iteye.com

* </p>

* <p>

* Create time: 2011-8-11

* </p>

*

* @author 丸子

* @version 0.0.1

*/

public class SlipView extends View {

        private static final String TAG = "SlipView";

        /** Listen slip on the block, no matter the event is success or fail */

        private OnSlipListener onSlipListener;

        /** Slip entity to set the value about backImage, frontImage position */

        private SlipEntity slipEntity;

        private float tmpTouchX;

        private float tmpTouchGap;



        public SlipView(Context context) {

                super(context);

                Bitmap backImage = ((BitmapDrawable) getResources().getDrawable(

                                R.drawable.back5)).getBitmap();

                Bitmap frotImage = ((BitmapDrawable) getResources().getDrawable(

                                R.drawable.frot1)).getBitmap();

                this.slipEntity = new SlipEntity(backImage, frotImage);

        }



        public SlipView(Context context, AttributeSet attr) {

                super(context, attr);

                Bitmap backImage = ((BitmapDrawable) getResources().getDrawable(

                                R.drawable.back5)).getBitmap();

                Bitmap frotImage = ((BitmapDrawable) getResources().getDrawable(

                                R.drawable.frot1)).getBitmap();

                this.slipEntity = new SlipEntity(backImage, frotImage);



        }



        public SlipView(Context context, SlipEntity slipEntity) {

                super(context);

                this.slipEntity = slipEntity;

        }



        @Override

        protected void onDraw(Canvas canvas) {

                super.onDraw(canvas);

                if (!this.slipEntity.isInit) {

                        Log.v(TAG, "Init SlipEntity");

                        this.slipEntity.initSlipEntity(this.getWidth(), this.getHeight());

                }

                canvas.drawBitmap(this.slipEntity.getBackImage(),

                                this.slipEntity.xBackStart, this.slipEntity.yBackStart, null);

                canvas.drawBitmap(this.slipEntity.getFrotImage(),

                                this.slipEntity.xFrotStart, this.slipEntity.yFrotStart, null);

        }



        /**

         * listen touch events and notify listener

         */



        @Override

        public boolean onTouchEvent(MotionEvent event) {



                Log.v(TAG, "Touch Position:" + event.getX());

                switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:

                        // Log.v(TAG, "Down");

                        if (this.slipEntity.isPointInImage(SlipEntity.FLAG_FROT,

                                        event.getX(), event.getY())) {

                                this.tmpTouchX = event.getX();



                                this.tmpTouchGap = event.getX() - this.slipEntity.xFrotStart;

                        }

                        break;

                case MotionEvent.ACTION_MOVE:

                        // Log.v(TAG, "Move");

                        this.slipEntity.isReachRight();

                        this.slipEntity.isReachLeft();

                        // if point(x,y) is not in back image, front image will not move

                        if (this.slipEntity.isPointInImage(SlipEntity.FLAG_BACK,

                                        event.getX(), event.getY())) {

                                // Log.v(TAG, "Move2");

                                this.slipEntity.xFrotStart = event.getX() - this.tmpTouchGap;

                        }

                        break;

                case MotionEvent.ACTION_UP:

                        Log.v(TAG, "Up");

                        int flagLR = 0;

                        if (event.getX() < this.tmpTouchX)

                                flagLR = 1;

                        else

                                flagLR = 2;

                        float dockPer = this.slipEntity.isDock();

                        if (dockPer != -1) {

                                // Dock at some Position

                                if (this.onSlipListener != null)

                                        this.onSlipListener.slipDock(slipEntity, event,

                                                        this.slipEntity.getCurDockPer());

                                if (event.getX() < this.tmpTouchX) {

                                        // Slip: <==

                                        if (dockPer == 0.0) {

                                                // Reached

                                                if (this.onSlipListener != null)

                                                        this.onSlipListener.slipLeft(slipEntity, event,

                                                                        true);

                                        } else {

                                                // Not Reached

                                                this.slipEntity.xFrotStart = this.slipEntity

                                                                .getCurDockPos();

                                                if (this.onSlipListener != null)

                                                        this.onSlipListener.slipLeft(slipEntity, event,

                                                                        false);

                                        }

                                } else {

                                        // Slip: ==>

                                        if (dockPer == 1.0) {

                                                // Reached

                                                if (this.onSlipListener != null)

                                                        this.onSlipListener.slipRight(slipEntity, event,

                                                                        true);

                                        } else {

                                                // Not Reached

                                                this.slipEntity.xFrotStart = this.slipEntity

                                                                .getCurDockPos();

                                                if (this.onSlipListener != null)

                                                        this.onSlipListener.slipRight(slipEntity, event,

                                                                        false);

                                        }

                                        break;

                                }

                        } else {

                                // No dock

                                this.slipEntity.xFrotStart = this.slipEntity.getCurDockPos();

                                if (flagLR == 1)

                                        this.onSlipListener.slipLeft(slipEntity, event, false);

                                else

                                        this.onSlipListener.slipRight(slipEntity, event, false);

                        }

                        // if (event.getX() < this.tmpTouchX)

                        // {



                        // // Slip: <== // if (this.slipEntity.isReachLeft())

                        // { // // Reached



                        // if (this.onSlipListener != null)

                        // this.onSlipListener.slipLeft(slipEntity, event, true);

                        // }

                        // else

                        // {

                        // // Not Reached

                        // this.slipEntity.xFrotStart = this.slipEntity.getCurDockPos();

                        // if (this.onSlipListener != null)

                        // this.onSlipListener.slipLeft(slipEntity, event, false);

                        // }

                        // }

                        // else

                        // {

                        // // Slip: ==>

                        // if (this.slipEntity.isReachRight())

                        // {

                        // // Reached

                        // if (this.onSlipListener != null)

                        // this.onSlipListener.slipRight(slipEntity, event, true);

                        // }

                        // else

                        // {

                        // // Not Reached

                        // this.slipEntity.xFrotStart = this.slipEntity.getCurDockPos();

                        // if (this.onSlipListener != null)

                        // this.onSlipListener.slipRight(slipEntity, event, false);

                        // }

                        // break;

                        // }

                }

                this.invalidate();

                return true;

        }



        /**

         * Listener on slip event on slippery view author diydyq

         *

         */

        public interface OnSlipListener {

                /**

                 * Listen a slip after touch down and up, not including touch move

                 *

                 * @param slipEntity

                 * @param event

                 * @param isSuccess

                 */



                public abstract void slipLeft(SlipEntity slipEntity, MotionEvent event,

                                boolean isSuccess);



                /**

                 * Listen a slip after touch down and up, not including touch move

                 *

                 * @param slipEntity

                 * @param event

                 * @param isSuccess

                 */

                public abstract void slipRight(SlipEntity slipEntity,

                                MotionEvent event, boolean isSuccess);



                /**

                 * Listen some dock(more than DOCK_L,DOCK_R), normally need not

                 * implement it unless more docks are needed.

                 *

                 * @param slipEntity

                 * @param event

                 * @param dockPer

                 */

                public abstract void slipDock(SlipEntity slipEntity, MotionEvent event,

                                float dockPer);

        }



        public OnSlipListener getOnSlipListener() {

                return onSlipListener;

        }



        public void setOnSlipListener(OnSlipListener onSlipListener) {

                this.onSlipListener = onSlipListener;

        }

}
复制代码



IaiaiActivity.java
Java代码

package com.iaiai.activity;



import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.drawable.BitmapDrawable;

import android.os.Bundle;

import android.util.Log;

import android.view.MotionEvent;



import com.iaiai.activity.SlipView.OnSlipListener;



/**

*

* <p>

* Title: IaiaiActivity.java

* </p>

* <p>

* E-Mail: 176291935@qq.com

* </p>

* <p>

* QQ: 176291935

* </p>

* <p>

* Http: iaiai.iteye.com

* </p>

* <p>

* Create time: 2011-8-11

* </p>

*

* @author 丸子

* @version 0.0.1

*/

public class IaiaiActivity extends Activity {



        @Override

        public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                // setContentView(R.layout.main);



                SlipView view;



                // 1.Code

                Bitmap backImage = ((BitmapDrawable) getResources().getDrawable(

                                R.drawable.back5)).getBitmap();

                Bitmap frotImage = ((BitmapDrawable) getResources().getDrawable(

                                R.drawable.frot1)).getBitmap();

                SlipEntity entity = new SlipEntity(backImage, frotImage);

                entity.setCurDockPos(SlipEntity.DOCK_R);

                entity.addDockPos((float) 0.5);



                view = new SlipView(this, entity);



                // 2.Code

                // view = new SlipView(this);



                // 3.XML

                // view = (SlipView)this.findViewById(R.id.slipView);



                setContentView(view);

                view.setOnSlipListener(new OnSlipListener() {

                        @Override

                        public void slipLeft(SlipEntity slipEntity, MotionEvent event,

                                        boolean isSuccess) {

                                Log.v("Left", Boolean.toString(isSuccess));

                        }



                        @Override

                        public void slipRight(SlipEntity slipEntity, MotionEvent event,

                                        boolean isSuccess) {

                                Log.v("Right", Boolean.toString(isSuccess));

                        }



                        @Override

                        public void slipDock(SlipEntity slipEntity, MotionEvent event,

                                        float dockPer) {

                                Log.v("Dock", "dockPer:" + dockPer);

                        }

                });

        }



}
复制代码



下面是用到的三张图片:





2011-9-12 13:35:44 上传
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:58:03 | 显示全部楼层

Re:Android

路过,顺便挣你十个豆.
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:58:07 | 显示全部楼层

Re:Android

路过,顺便挣你十个豆.
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:58:11 | 显示全部楼层

Re:Android

路过,顺便挣你十个豆.
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:58:15 | 显示全部楼层

Re:Android

路过,顺便挣你十个豆.
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:58:19 | 显示全部楼层

Re:Android

路过,顺便挣你十个豆.
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:58:23 | 显示全部楼层

Re:Android

路过,顺便挣你十个豆.
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:58:32 | 显示全部楼层

Re:Android

路过,顺便挣你十个豆.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 13:57 , Processed in 0.387077 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表