安卓开发之自定义SeekBar竖立类(顺时针逆时针旋转90度)
来源:互联网 发布:c语言中的continue 编辑:程序博客网 时间:2024/05/15 08:08
类名:VerticalSeekBar
public class VerticalSeekBar extends SeekBar{private boolean mIsDragging; private float mTouchDownY; private int mScaledTouchSlop; private boolean isInScrollingContainer = false; public boolean isInScrollingContainer() { return isInScrollingContainer; } public void setInScrollingContainer(boolean isInScrollingContainer) { this.isInScrollingContainer = isInScrollingContainer; } float mTouchProgressOffset; public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); } public VerticalSeekBar(Context context, AttributeSet attrs) { super(context, attrs); } public VerticalSeekBar(Context context) { super(context); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(h, w, oldh, oldw); } @Override protected synchronized void onMeasure(int widthMeasureSpec,int heightMeasureSpec) { super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); } @Override protected synchronized void onDraw(Canvas canvas) { //顺针旋转90度, canvas.rotate(90); canvas.translate(0, -getWidth()); //逆时针旋转90度 //canvas.rotate(-90); //canvas.translate(-getHeight(), 0);//以原点纵坐标设置为负(滑块高度) super.onDraw(canvas); } @Override public boolean onTouchEvent(MotionEvent event) { if (!isEnabled()) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN://按下 if (isInScrollingContainer()) { mTouchDownY = event.getY(); } else { setPressed(true); invalidate(); onStartTrackingTouch(); trackTouchEvent(event); attemptClaimDrag(); onSizeChanged(getWidth(), getHeight(), 0, 0); } break; case MotionEvent.ACTION_MOVE://移动 if (mIsDragging) { trackTouchEvent(event); } else { final float y = event.getY(); if (Math.abs(y - mTouchDownY) > mScaledTouchSlop) { setPressed(true); invalidate(); onStartTrackingTouch(); trackTouchEvent(event); attemptClaimDrag(); } } onSizeChanged(getWidth(), getHeight(), 0, 0); break; case MotionEvent.ACTION_UP://抬起 if (mIsDragging) { trackTouchEvent(event); onStopTrackingTouch(); setPressed(false); } else { onStartTrackingTouch(); trackTouchEvent(event); onStopTrackingTouch(); } onSizeChanged(getWidth(), getHeight(), 0, 0); invalidate(); break; } return true; } private void trackTouchEvent(MotionEvent event) { final int height = getHeight(); final int top = getPaddingTop(); final int bottom = getPaddingBottom(); final int available = height - top - bottom; int y = (int) event.getY(); float scale; float progress = 0; if (y > height - bottom) { scale = 0.0f; } else if (y < top) { scale = 1.0f; } else { scale = (float) (available - y + top) / (float) available; progress = mTouchProgressOffset; } final int max = getMax(); progress = progress + scale * max; progress = max - progress;//顺时针旋转90度使用,逆时针旋转90度屏蔽此段 setProgress((int) progress); } /** * 按下 */ void onStartTrackingTouch() { mIsDragging = true; } /** * 松开 */ void onStopTrackingTouch() { mIsDragging = false; } private void attemptClaimDrag() { ViewParent p = getParent(); if (p != null) { p.requestDisallowInterceptTouchEvent(true); } } @Override public synchronized void setProgress(int progress) { super.setProgress(progress); onSizeChanged(getWidth(), getHeight(), 0, 0); }}
XML中:
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:text="0" />
<com.example.项目名.VerticalSeekBar
android:id="@+id/verticalSeekBar"
android:layout_width="wrap_content"
android:layout_height="200dp"/>
在Activity中使用:
private VerticalSeekBar verticalSeekBar = null;
verticalSeekBar = (VerticalSeekBar)findViewById(R.id.verticalSeekBar);
verticalSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
@Override
public void onStopTrackingTouch(SeekBar seekBar){}
@Override
public void onStartTrackingTouch(SeekBar seekBar){}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser)
{
TextView tv= (TextView)findViewById(R.id.textview1);
tv.setText(Integer.toString(progress));
}
});
PS:类中设置的是滑块控件顺时针旋转90度。
如图,白框为屏幕区域,红色为控件,按照原点逆时针旋转90度后,已经不在屏幕显示区域了,需要将控件平移。
//getHeight()为控件高度,getWidth()为控件宽度
顺时针旋转90度:
canvas.rotate(90);
canvas.translate(0, -getWidth());//右移一个控件宽度
progress = max - progress;
逆时针旋转90度:canvas.rotate(-90);//逆时针旋转90度
canvas.translate(-getHeight(), 0);//下移一个控件高度
- 安卓开发之自定义SeekBar竖立类(顺时针逆时针旋转90度)
- 算法:数组顺时针、逆时针90度旋转
- 图片旋转工具类(分为:顺时针旋转90度、逆时针旋转90度、旋转180度、水平旋转、垂直旋转)
- android开发直播将yvu420顺时针逆时针各旋转90度
- Arrays_Strings 90度顺时针逆时针旋转方形矩阵 @CareerCup
- php图像旋转,图片旋转(逆时针90或者顺时针90)
- openCv 图像顺时针、逆时针旋转
- openCv 图像顺时针、逆时针旋转
- OpenCV Mat结构的图片 旋转顺时针90度 180度 270度 逆时针90度
- YUV420P 旋转90度(逆时针)
- YUV422逆时针旋转90度
- 矩阵逆时针旋转90度
- 由外向内顺时针&逆时针旋转矩阵
- 安卓开发之自定义粒子旋转动画加载控件
- 安卓自定义圆形seekBar
- 顺时针旋转图片90度(算法)
- 由内向外顺时针旋转队列&逆时针旋转队列
- 顺时针?逆时针?
- Coreseek + Sphinx + Mysql + PHP构建中文检索引擎
- fscanf()函数详解
- 设计模式之适配器模式(Java)
- Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000007f7500000, 142606336, 0)
- NOIP 2016 酱油记
- 安卓开发之自定义SeekBar竖立类(顺时针逆时针旋转90度)
- wordpress更换域名的几个步骤
- Android软键盘的显示和隐藏
- python的pip工具
- log4j 配置详解
- 几道常见的web前端工程师笔试题
- Maven的常用命令
- Android ScrollView嵌套ScrollView滚动的问题解决办法
- Android系统分析之异步消息处理机制-Message/Handler/MessageQueue/Looper