自定义拖动条android,Android自定义垂直拖动搜索条进度条

Android的进度条是不能满足我们的需求,通常我们都是拖动滑块作为自定义图像,并且背景也是自定义的,所以不要说太多废话,今天爱站技术频道小编就带你来了解Android自定义垂直拖动搜索条进度条吧!

Android自带的SeekBar是水平的,要垂直的,必须自己写一个类,继承SeekBar。

一个简单的垂直SeekBar的例子:

(但是它其实是存在一些问题的。不过要是满足基本需要还是可以凑合的)

package com.example.helloverticalseekbar;

import android.content.Context;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.widget.SeekBar;

public class VerticalSeekBar extends SeekBar

{

public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle)

{

super(context, attrs, defStyle);

}

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)

{

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:

case MotionEvent.ACTION_MOVE:

case MotionEvent.ACTION_UP:

setProgress(getMax()

- (int) (getMax() * event.getY() / getHeight()));

onSizeChanged(getWidth(), getHeight(), 0, 0);

break;

case MotionEvent.ACTION_CANCEL:

break;

}

return true;

}

}

Demo中加上一个水平SeekBar作为对比,代码如下:

Activity:

HelloSeekBarActivity

package com.example.helloverticalseekbar;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.Menu;

import android.widget.SeekBar;

import android.widget.TextView;

import android.widget.SeekBar.OnSeekBarChangeListener;

public class HelloSeekBarActivity extends Activity

{

private SeekBar horiSeekBar = null;

private TextView horiText = null;

private VerticalSeekBar verticalSeekBar = null;

private TextView verticalText = null;

@Override

protected void onCreate(Bundle savedInstanceState)

{

Log.d(AppConstants.LOG_TAG, "onCreate");

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_hello_seek_bar);

horiSeekBar = (SeekBar) findViewById(R.id.horiSeekBar);

horiText = (TextView)findViewById(R.id.horiText);

horiSeekBar.setOnSeekBarChangeListener(horiSeekBarListener);

verticalSeekBar = (VerticalSeekBar)findViewById(R.id.verticalSeekBar);

verticalText = (TextView)findViewById(R.id.verticalText);

verticalSeekBar.setOnSeekBarChangeListener(verticalSeekBarChangeListener);

}

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

getMenuInflater().inflate(R.menu.hello_seek_bar, menu);

return true;

}

private OnSeekBarChangeListener horiSeekBarListener = new OnSeekBarChangeListener()

{

@Override

public void onStopTrackingTouch(SeekBar seekBar)

{

}

@Override

public void onStartTrackingTouch(SeekBar seekBar)

{

}

@Override

public void onProgressChanged(SeekBar seekBar, int progress,

boolean fromUser)

{

Log.d(AppConstants.LOG_TAG, "Horizontal SeekBar --> onProgressChanged");

horiText.setText(Integer.toString(progress));

}

};

private OnSeekBarChangeListener verticalSeekBarChangeListener = new OnSeekBarChangeListener()

{

@Override

public void onStopTrackingTouch(SeekBar seekBar)

{

}

@Override

public void onStartTrackingTouch(SeekBar seekBar)

{

}

@Override

public void onProgressChanged(SeekBar seekBar, int progress,

boolean fromUser)

{

Log.d(AppConstants.LOG_TAG, "Vertical SeekBar --> onProgressChanged");

verticalText.setText(Integer.toString(progress));

}

};

}

布局:

activity_hello_seek_bar.xml

运行截图:

15bd7cf043c1d17a3cbdf4b6b02ab0ea.png

一个改进版的SeekBar

package com.example.helloverticalseekbarv2;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Rect;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewConfiguration;

import android.view.ViewGroup;

import android.view.ViewParent;

import android.widget.SeekBar;

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;

}

/**

* On touch, this offset plus the scaled value from the position of the

* touch will form the progress value. Usually 0.

*/

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)

{

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

{

// Touch up when we never crossed the touch slop threshold

// should

// be interpreted as a tap-seek to that location.

onStartTrackingTouch();

trackTouchEvent(event);

onStopTrackingTouch();

}

onSizeChanged(getWidth(), getHeight(), 0, 0);

// ProgressBar doesn't know to repaint the thumb drawable

// in its inactive state when the touch stops (because the

// value has not apparently changed)

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

以上就是关于Android自定义垂直拖动搜索条进度条的介绍,如果你也想要学习这些知识,可以到js.aizhan.com学习,相信这里肯定有你想要的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想要实现自定义的视频播放进度条和暂停/播放按钮,可以按照以下步骤进行: 1. 在布局文件中添加 VideoView、SeekBar 和暂停/播放按钮: ``` <VideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> <SeekBar android:id="@+id/seek_bar" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/play_pause_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pause" /> ``` 2. 在 Activity 中获取 VideoView、SeekBar 和暂停/播放按钮的引用: ``` VideoView videoView = findViewById(R.id.video_view); SeekBar seekBar = findViewById(R.id.seek_bar); Button playPauseButton = findViewById(R.id.play_pause_button); ``` 3. 设置 VideoView 的路径并开始播放: ``` videoView.setVideoPath("path/to/video.mp4"); videoView.start(); ``` 4. 为 VideoView 添加一个 OnPreparedListener,当视频准备好时,设置 SeekBar 的最大值和添加一个定时器来更新 SeekBar 的进度: ``` videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { seekBar.setMax(videoView.getDuration()); final Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { seekBar.setProgress(videoView.getCurrentPosition()); handler.postDelayed(this, 1000); } }; handler.postDelayed(runnable, 1000); } }); ``` 5. 为 SeekBar 添加一个 OnSeekBarChangeListener,当拖动 SeekBar 时,改变视频播放的位置: ``` seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { videoView.seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} }); ``` 6. 为暂停/播放按钮添加一个 OnClickListener,当点击按钮时,暂停或继续播放视频: ``` playPauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (videoView.isPlaying()) { videoView.pause(); playPauseButton.setText("Play"); } else { videoView.start(); playPauseButton.setText("Pause"); } } }); ``` 7. 为 VideoView 添加一个 OnCompletionListener,当视频播放完成时,将暂停/播放按钮的文本设置为“Play”: ``` videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { playPauseButton.setText("Play"); } }); ``` 以上就是实现自定义视频播放进度条和暂停/播放按钮的方法。您可以根据您的需求自定义 SeekBar 的样式和暂停/播放按钮的图标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值