自定义控件day02笔记
来源:互联网 发布:php 读取文件夹 图片 编辑:程序博客网 时间:2024/05/01 02:07
SrollTo
view的显示坐标,其实就是无边界的坐标,控件的显示其实有固定的局域,但是在控件之外还有很多的坐标点,只不过是我们的控件没有显示出来而已
以控件的左上角为原点来计算 (0,0) , 如果是scrollTo(-50 , 0 ) , 那么将会把左边 负数坐标的内容给拽拉出来,放到这个控件的0,0来显示。 如果是 scrollTo(50 , 0 ) , 那么将会把右边 正数坐标的内容给拽拉过去,放到这个控件的0 ,0 来显示。
ScrollTo:如果是负数,那么将左边不可见的(x,y)坐标内容滑出来
SrcollTo:如果是正数,那么右边不可见的(x,y)坐标内容滑出来
左边边界判断:
如果是DownX-(BitMap.getwidth)/2=dx;
dx
SrollBy和SrollTo的区别
SroollTo是直接移动到设定的位置;
SrcollBy是在原先的基础上做增量移动(叠加);
getScollX是获取移动的距离–如果是负数表明滑块向右边移动,如果是正数则表明滑块向左边移动
Scroller
是一个工具类,能够平滑,柔顺的滑动页面,控件
使用步骤:
1.定义一个Srocller对象 Sroller mSroller=new Sroller(Context context); 2.使用Sroller的startsroll开始移动 /* 开始移动 * 参数一: 开始移动的x坐标点 * 参数二: 开始移动的y坐标点 * 参数三: 水平方向移动的距离 * 参数四: 垂直方向移动的距离 * 参数五: 移动的时长。 * / mSroller.startSroll(startX,startY,dx,dy,duration); //////////////////// @Override public void computeScroll() { //0 -1 -2 -3 -4 。。。。。 -100 //-50 //早前的移动仍然没有做完 if(mScroller.computeScrollOffset()){ //重新获取目前移动的位置 int currentX = mScroller.getCurrX(); scrollTo(currentX, 0); //再一次重绘 invalidate(); }else{ //判断是否已经移动到右边边界了 if(isToRight){ mListener.onUnLock(); isToRight = false; } }}
案例–滑动解锁
布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000000"tools:context=".MainActivity" ><com.lxk.slideunlock.view.SildeUnLockView android:id="@+id/slv" android:layout_alignParentBottom="true" <!--这里要在在drawable文件写一个shap布局shap_dg_open,设定半径radius:10dp,颜色背景#55FFFFFF--> android:background="@drawable/shap_dg_open" android:layout_width="match_parent" android:layout_height="wrap_content" /></RelativeLayout>
代码 MainActivity
package com.lxk.slideunlock;import com.lxk.slideunlock.view.SildeUnLockView;import com.lxk.slideunlock.view.SildeUnLockView.OnUnLockListener;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.Toast;public class MainActivity extends Activity implements OnUnLockListener {private SildeUnLockView mSlv;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSlv = (SildeUnLockView) findViewById(R.id.slv); mSlv.setOnUnLockListener(this);}@Overridepublic void UnLock() { //利用接口回调方法 Toast.makeText(this,"成功解锁", 0).show(); finish();}}
自定义 SildeUnLockView 代码
package com.lxk.slideunlock.view;import com.lxk.slideunlock.R;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.provider.ContactsContract.CommonDataKinds.Event;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.Scroller;/** * 滑动解锁--View是表示显示在UI界面上面的 * 自定义View的三个步骤: * 1.测量自己的大小 * 2.设置自己现在在父控件的位置 * 3.绘画该控件出来 */public class SildeUnLockView extends View{private static boolean isRight = false;private Paint mPaint;private Scroller mScroller;private Bitmap mBitmap;public SildeUnLockView(Context context, AttributeSet attrs) { super(context, attrs); //创建一个画笔 mPaint = new Paint(); //创建一个滑动效果的工具类Scroller(context)--- mScroller = new Scroller(context); //加载一个图片 mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_button);}//测量自己的大小@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //super.onMeasure(widthMeasureSpec, heightMeasureSpec);//这个是使用父类布局的大小 //设置图片的宽度跟父类一样 int width = MeasureSpec.getSize(widthMeasureSpec); setMeasuredDimension(width, mBitmap.getHeight());}//绘画@Overrideprotected void onDraw(Canvas canvas) { //绘画该图片出来 canvas.drawBitmap(mBitmap, 0, 0, mPaint);}float mDownX,mMoveX,mUpX;//重写父类的onTuchEvent(MotionEvent event)方法来监听触摸事件@Overridepublic boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN://监听按下的动作 //开始规定如果鼠标按下的X坐标不在图片的宽度/2和图片的宽度之间,就不允许滑动 mDownX=event.getX(); if (mDownX<mBitmap.getWidth()/2||mDownX>mBitmap.getWidth()) { return false;//false则交给系统处理 不需要我们处理,相当不允许图片滑动了 } //执行按下的操作方法 performDown(); break; case MotionEvent.ACTION_MOVE://鼠标触摸移动的动作 //获取移动的X的位置 mMoveX=event.getX(); performMove(); break; case MotionEvent.ACTION_UP://鼠标抬起的动作 mUpX=event.getX(); performUp(); break; } return true;//true表示事件发生的改变,都由我们自己处理,不需要别人}//执行抬起的动作方法private void performUp() { //规定如果抬起来的X坐标大于控件背景一般则直接移动到右边的边界处,否则直接移动到左边的边界 int dx=0; if (mUpX>getMeasuredWidth()/2) { isRight=true; dx=(int) (mBitmap.getWidth()-getMeasuredWidth()-getScrollX()); System.out.println("dx=== 1"+dx); } else { dx=-getScrollX(); System.out.println("dx===2 "+dx); } int durantion=dx*7; //如果时间太长则就按1000毫秒来算 if (durantion>1000) { durantion=1000; } //利用Scroller类来来滑动==参数一二表示:开始移动的xy坐标,参数三四:表示水平和垂直移动的距离,参数五:移动的时间 mScroller.startScroll(getScrollX(), 0, dx, 0,durantion); //重新绘制 invalidate();}//当前没有移动完则继续移动@Overridepublic void computeScroll() { super.computeScroll(); if (mScroller.computeScrollOffset()) { //获取当前的移动X坐标 int currX = mScroller.getCurrX(); //继续移动完 scrollTo(currX, 0); //重新绘制 invalidate(); } else { //判断是否是向右边移动如果是且超过背景一半则解锁 if (isRight) { mListener.UnLock(); //重置状态 isRight=false; } }}//执行移动的距离private void performMove() { int dx=Math.round(mDownX-mMoveX); //界定边界--判断移动过程是否超过边界 if (-dx>getMeasuredWidth()-mBitmap.getWidth()) {//判断右边的边界 dx=mBitmap.getWidth()-getMeasuredWidth(); } else if (dx>0) {//判断左边的边界 dx=0; } scrollTo(dx, 0);//SroollTo是直接移动到设定的位置}OnUnLockListener mListener;//定义一个成员的变量:mListenerpublic void setOnUnLockListener(OnUnLockListener listener){ mListener=listener;//通过MainActivity传过来的参数 }//创建一个接口回调public interface OnUnLockListener{ public void UnLock(); }}
0 0
- 自定义控件day02笔记
- 笔记day02
- Day02笔记
- Day02--笔记
- 笔记day02
- day02笔记
- java 学习笔记 day02
- Jquery学习笔记---Day02
- C++ 学习笔记day02
- 黑马程序员:day02笔记
- mysql 学习笔记 day02
- [Java视频笔记]day02
- 工作笔记day02
- Java笔记Day02
- JavaSE基础笔记 day02
- Linux 笔记day02
- JavaSE day02笔记
- Java学习笔记 day02
- Apache Tomcat 8_源码编译、安装及调试
- 特征值与特征向量的几何意义
- 01 戴尔混合云DHCS今生与前世
- HDU3746-Cyclic Nacklace
- HDU 4417 Super Mario(离线线段树)
- 自定义控件day02笔记
- 分治法,中途相遇法(Non-boring sequences,uva 1608)
- 顺序表应用6:有序顺序表查询
- Spark——SparkContext简单分析
- Oracle函数,按分隔符截取字符串
- httpurlconnection发送文件到服务端并接收
- light oj 1211 - Intersection of Cubes (计算几何)
- 【转】intellij IDEA里各图标对应的文件类型
- RCU机制详解