VerticalSeekbar自适应屏幕旋转响应
来源:互联网 发布:语音对话机器人app源码 编辑:程序博客网 时间:2024/05/16 12:49
网上有很多VerticalSeekbar,继承AbsSeekBar, 适用于UI固定的情况;
如果程序要自适应屏幕旋转,竖屏的时候用水平seekbar, 垂直的时候用VerticalSeekBar, 会出现旋转之后seekbar是两个不同的id, onProgressChanged无法收到 VerticalSeekbar 发过来的数据;
VerticalSeekbar代码如下:`
public class VerticalSeekBar extends SeekBar {
private String TAG = "VerticalSeekBar";public VerticalSeekBar(Context context) { super(context); // TODO Auto-generated constructor stub}public VerticalSeekBar(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub}public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub}//监听器用父类的;private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener;public void setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener l) { mOnSeekBarChangeListener = l;}void onStartTrackingTouch() { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStartTrackingTouch(this); }}void onStopTrackingTouch() { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStopTrackingTouch(this); }}void onProgressRefresh(float scale, boolean fromUser) { Drawable thumb = mThumb; if (thumb != null) { setThumbPos(getHeight(), thumb, scale, Integer.MIN_VALUE); invalidate(); } if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), fromUser); }}private void setThumbPos(int w, Drawable thumb, float scale, int gap) { //Log.e(TAG, "setThumbPos scale = " + scale + ", w = " + w ); int available = w - getPaddingLeft() - getPaddingRight(); int thumbWidth = thumb.getIntrinsicWidth(); int thumbHeight = thumb.getIntrinsicHeight(); available -= thumbWidth; available += getThumbOffset() * 2; int thumbPos = (int) (scale * available); int topBound, bottomBound; if (gap == Integer.MIN_VALUE) { Rect oldBounds = thumb.getBounds(); topBound = oldBounds.top; bottomBound = oldBounds.bottom; } else { topBound = gap; bottomBound = gap + thumbHeight; } thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);}private Drawable mThumb;@Overridepublic void setThumb(Drawable thumb) { mThumb = thumb; super.setThumb(thumb);}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()); //宽高互换 } protected void onDraw(Canvas c) { c.rotate(-90); c.translate(-getHeight(),0); super.onDraw(c); } @Override public boolean onTouchEvent(MotionEvent event) { if (!isEnabled()) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: int i=0; i=getMax() - (int) (getMax() * event.getY() / getHeight()); setProgress(i); onSizeChanged(getWidth(), getHeight(), 0, 0); break; case MotionEvent.ACTION_CANCEL: break; } return true; }
}
MainActivity代码如下:
public class MainActivity extends Activity implements
SeekBar.OnSeekBarChangeListener
{
private Context m_fadbal_context;
private String TAG = "TEST";private TextView m_Balance_TextView;private TextView m_Fader_TextView;private SeekBar m_FaderSeekBar;private SeekBar m_BalanceSeekBar;// ------private RelativeLayout m_floatLayout;private RelativeLayout m_top_title_Layout;private View m_float_view;private WindowManager windowManager;private LayoutParams layoutParams, layoutParams_center;private int m_nBallWidth, m_nBallRadius;private boolean m_bLayoutTouchDown = false;private static boolean m_bFloatViewDisplayed = false;static float y0 = 0.0f, x0 = 0.0f;float delt_x = 0.0f, delt_y = 0.0f;private int m_nStatusBarHeight = 0;int m_nViewMove_x = 0, m_nViewMove_y = 0;public static boolean m_bCenterWinDisplayed = false;private float m_center_x = 0.0f;private float m_center_y = 0.0f;private float m_action_w = 0.0f;private float m_action_h = 0.0f;private float m_action_left = 0.0f;private float m_action_top = 0.0f;private float m_action_right = 0.0f;private float m_action_bottom = 0.0f;private float m_fMoveStep = 0.0f;private static int m_nFader = 10;private static int m_nBalance = 10;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initActivity();}public void onStart() { super.onStart();}@Overridepublic synchronized void onResume() { super.onResume(); getFloatLayoutRect();}@Overridepublic synchronized void onPause() { super.onPause();}public void initActivity() { setContentView(R.layout.test); m_fadbal_context = this; m_Balance_TextView = (TextView) findViewById(R.id.balance_value); m_Fader_TextView = (TextView) findViewById(R.id.fader_value ); m_FaderSeekBar = (SeekBar) findViewById(R.id.fader_seek_bar); m_BalanceSeekBar = (SeekBar) findViewById(R.id.balance_seek_bar); m_FaderSeekBar.setMax(20); m_FaderSeekBar.setProgress( m_nFader ); m_BalanceSeekBar.setMax(20); m_BalanceSeekBar.setProgress( m_nBalance ); //Log.e(TAG, "rec: fad =" + m_nFader + ", bal = " + m_nBalance ); m_FaderSeekBar.setOnSeekBarChangeListener((OnSeekBarChangeListener) this); m_BalanceSeekBar.setOnSeekBarChangeListener((OnSeekBarChangeListener) this); // ------------------------------------------------------------------------------------ windowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE); if( m_float_view == null ) m_float_view = LayoutInflater.from(this).inflate(R.layout.floating, null); Bitmap m_float_view_bmp = BitmapFactory.decodeResource( m_fadbal_context.getResources(), R.drawable.ball); m_nBallWidth = m_float_view_bmp.getWidth(); m_nBallRadius = (int) ( m_nBallWidth >> 1 ); m_float_view_bmp.recycle(); /* * LayoutParams.TYPE_SYSTEM_ERROR:保证该悬浮窗所有View的最上层 * LayoutParams.FLAG_NOT_FOCUSABLE:该浮动窗不会获得焦点,但可以获得拖动 * PixelFormat.TRANSPARENT:悬浮窗透明 */ layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_SYSTEM_ERROR, LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSPARENT); layoutParams.gravity = Gravity.LEFT | Gravity.TOP; m_top_title_Layout = (RelativeLayout) findViewById(R.id.setting_top_bar_layout); m_floatLayout = (RelativeLayout) findViewById(R.id.float_layout); m_floatLayout.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { layoutParams.gravity = Gravity.LEFT | Gravity.TOP; int eventaction = event.getAction(); switch (eventaction) { case MotionEvent.ACTION_DOWN: { m_nViewMove_x = (int) event.getRawX(); m_nViewMove_y = (int) event.getRawY() - m_nStatusBarHeight; if( m_nViewMove_x > m_action_left && m_nViewMove_x < m_action_right && m_nViewMove_y > m_action_top && m_nViewMove_y < m_action_bottom ) { refreshView( m_nViewMove_x, m_nViewMove_y ); m_nBalance = (int)( ( m_nViewMove_x - m_action_left ) / m_fMoveStep ); m_nFader = (int)( 20 - ( m_nViewMove_y - m_action_top ) / m_fMoveStep ) ; updateFaderSeekBarText(); m_FaderSeekBar.setProgress( m_nFader ); updateBalanceSeekBarText(); m_BalanceSeekBar.setProgress(m_nBalance); } } break; } return false; } }); m_float_view.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { layoutParams.gravity = Gravity.LEFT | Gravity.TOP; int eventaction = event.getAction(); switch (eventaction) { case MotionEvent.ACTION_DOWN: // 按下事件,记录按下时手指在悬浮窗的XY坐标值 { m_bLayoutTouchDown = true; } break; case MotionEvent.ACTION_MOVE: { m_nViewMove_x = (int) event.getRawX(); m_nViewMove_y = (int) event.getRawY() - m_nStatusBarHeight; if( m_nViewMove_x < m_action_left ) m_nViewMove_x = (int)m_action_left; if( m_nViewMove_x > m_action_right ) m_nViewMove_x = (int)m_action_right; if( m_nViewMove_y < m_action_top ) m_nViewMove_y = (int)m_action_top; if( m_nViewMove_y > m_action_bottom ) m_nViewMove_y = (int)m_action_bottom; refreshView( m_nViewMove_x, m_nViewMove_y ); // 转成fader/balance m_nBalance = (int)( ( m_nViewMove_x - m_action_left ) / m_fMoveStep ); m_nFader = (int)( 20 - ( m_nViewMove_y - m_action_top ) / m_fMoveStep ) ; updateFaderSeekBarText(); m_FaderSeekBar.setProgress( m_nFader ); updateBalanceSeekBarText(); m_BalanceSeekBar.setProgress(m_nBalance); } break; case MotionEvent.ACTION_UP: { m_bLayoutTouchDown = false; } break; } return true; } }); // -----------------------------------------------------------------------}private Timer m_IdelTimer = null;private MyIdelTimerTask m_IdelTimerTask = null;private long m_lInterval = 200;private final int GET_PARAMS = 0x20;protected class MyIdelTimerTask extends TimerTask { @Override public void run() { // TODO Auto-generated method stub mHandler.sendEmptyMessage(GET_PARAMS); }} // end classprivate Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case GET_PARAMS: { if( m_nStatusBarHeight == 0 ){ View rootView = m_floatLayout.getRootView(); Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); m_nStatusBarHeight = r.top; } int top_title_height = m_top_title_Layout.getHeight(); int float_top = m_floatLayout.getTop(); int float_bottom = m_floatLayout.getBottom(); int float_left = m_floatLayout.getLeft(); int float_right = m_floatLayout.getRight(); int canvas_w = float_right - float_left; int canvas_h = float_bottom - float_top; m_center_x = canvas_w / 2.0f; m_center_y = canvas_h / 2.0f + top_title_height; float min_canvas_w = Math.min(canvas_w, canvas_h); m_action_w = min_canvas_w * 0.75f; m_action_h = m_action_w; m_fMoveStep = m_action_w / 21.0f; m_action_left = m_center_x - m_action_w /2.0f ; m_action_right = m_center_x + m_action_w /2.0f ; m_action_top = m_center_y - m_action_h /2.0f ; m_action_bottom = m_center_y + m_action_h /2.0f; if (m_IdelTimer != null) { m_IdelTimer.cancel(); m_IdelTimer = null; } if (m_IdelTimerTask != null) { m_IdelTimerTask.cancel(); m_IdelTimerTask = null; } // ----- updateFloatLayout(); updateFaderSeekBarText(); m_FaderSeekBar.setProgress( m_nFader ); updateBalanceSeekBarText(); m_BalanceSeekBar.setProgress(m_nBalance); } break; } }}; // end mHandler;@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK) { this.finish(); return true; } return super.onKeyDown(keyCode, event);}public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //save first initActivity(); getFloatLayoutRect();}private void refreshFloatView() { if (m_bFloatViewDisplayed) { Log.e(TAG, "update m_float_view pos"); windowManager.updateViewLayout(m_float_view, layoutParams); } else { Log.e(TAG, "add m_float_view "); windowManager.addView(m_float_view, layoutParams); m_bFloatViewDisplayed = true; }}public void refreshView(int x, int y) { layoutParams.x = x - m_nBallRadius; layoutParams.y = y - m_nBallRadius; refreshFloatView();}public void getFloatLayoutRect() { if (m_IdelTimer != null) { m_IdelTimer.cancel(); m_IdelTimer = null; } if (m_IdelTimerTask != null) { m_IdelTimerTask.cancel(); m_IdelTimerTask = null; } m_IdelTimer = new Timer(); m_IdelTimerTask = new MyIdelTimerTask(); m_IdelTimer.schedule(m_IdelTimerTask, m_lInterval, m_lInterval);}//根据m_nFader, m_nBalance更新 layoutpublic void updateFloatLayout(){ int nViewMove_x = (int) ( m_action_left + m_fMoveStep * m_nBalance ); int nViewMove_y = (int) ( m_action_top + ( m_action_h - m_fMoveStep * m_nFader ) ); refreshView( nViewMove_x, nViewMove_y );}@Overridepublic void onProgressChanged(SeekBar seekbar, int pos, boolean arg2) { // TODO Auto-generated method stub if(seekbar.getId() == R.id.fader_seek_bar) { m_nFader = pos; String temp_str = ""; if( (m_nFader - 10) > 0 ) temp_str = "+" + Integer.toString( m_nFader - 10 ); else temp_str = Integer.toString( m_nFader - 10 ); m_Fader_TextView.setText( temp_str ); updateFloatLayout(); } else if( seekbar.getId() == R.id.balance_seek_bar ) { m_nBalance = pos; String temp_str = ""; if( (m_nBalance - 10) > 0 ) temp_str = "+" + Integer.toString( m_nBalance - 10 ); else temp_str = Integer.toString( m_nBalance - 10 ); m_Balance_TextView.setText( temp_str ); updateFloatLayout(); }}@Overridepublic void onStartTrackingTouch(SeekBar seekbar) { // TODO Auto-generated method stub if(seekbar.getId() == R.id.fader_seek_bar) { } else if( seekbar.getId() == R.id.balance_seek_bar ) { }}@Overridepublic void onStopTrackingTouch(SeekBar seekbar) { // TODO Auto-generated method stub if(seekbar.getId() == R.id.fader_seek_bar) { } else if( seekbar.getId() == R.id.balance_seek_bar ) { }}public void updateFaderSeekBarText(){ String temp_str = ""; if( (m_nFader - 10) > 0 ) temp_str = "+" + Integer.toString( m_nFader - 10 ); else temp_str = Integer.toString( m_nFader - 10 ); m_Fader_TextView.setText( temp_str );}public void updateBalanceSeekBarText(){ String temp_str = ""; if( (m_nBalance - 10) > 0 ) temp_str = "+" + Integer.toString( m_nBalance - 10 ); else temp_str = Integer.toString( m_nBalance - 10 ); m_Balance_TextView.setText( temp_str );}public void onStop(){ Log.e(TAG, "onStop"); windowManager.removeView(m_float_view); m_bFloatViewDisplayed = false; super.onStop();}
}
链接地址:http://download.csdn.net/detail/yunchang789/9720273
0 0
- VerticalSeekbar自适应屏幕旋转响应
- ios入门:自适应屏幕旋转
- iOS屏幕旋转,屏幕自适应方向变化
- Android: 屏蔽屏幕旋转响应
- iphone 自动响应旋转屏幕
- 【iOS界面开发】UIWindow屏幕旋转自适应
- xcode4.下使用Three20屏幕无法响应旋转
- 屏幕自适应
- 屏幕自适应
- 屏幕自适应
- 屏幕自适应
- 自适应屏幕
- 屏幕自适应
- 屏幕自适应
- 屏幕自适应
- iOS6下屏幕旋转不响应以及使用Three20不旋转解决方案
- iOS6下屏幕旋转不响应以及使用Three20不旋转解决方案
- 旋转屏幕
- Redis专题 -- 初识redis
- scrollView + viewPager + listView等复杂界面需求的实现
- 可持久化线段树
- Glide加载https图片
- Connection 元数据的使用例子
- VerticalSeekbar自适应屏幕旋转响应
- cogs396 [网络流24题]魔术球问题简化版
- Python爬虫包 BeautifulSoup 学习(四) bs基本对象与函数
- 12306.cn网站挂了”好文章收藏,引发的技术架构问题讨论。
- 时间戳
- javaScript 高阶函数 map/reduce/filter
- angularjs中下拉框select option默认值
- leetcode--3sum
- 拉丁矩阵问题