先看一下最终的效果
用户可以拖动两边来改变要截取音乐的长度,也可以直接拖红线来改变要截取音乐的位置
唯一的难点就是要计算出当前选择了多少秒,还有拖动时候的操作,我是直接创建的布局元素,通过onlayout()方法来改变控件的位置,废话不多说,直接上部分源代码
之前上传的代码有一些问题 现在重新上传 而且我们需求也跟着变了,因为之前写的代码 是按照歌曲的时间来百分比剪切,这样会造成如果大的文件剪切出来的文件会很大,现在我们限制一下最大最小的值 代码逻辑, 中间的进度条 我们按照默认1分钟来实现,每次进来的时候最小值为0.3 最大值为0.4 这样在宽度上会对用户的体验提高,这次直接附上所有源代码
//=========代码=====
/** * Created by mazhuang on 10/8/17. */ public class MusicIntercept extends RelativeLayout { private ImageView leftView; private LinearLayout lineLayout; private View view; private ImageView rightView; private RelativeLayout sliderLayout; private double minX;//最小值 private double maxX;//最大值 private int duration;//音乐时长 秒 private int leftMargin;//左边距 private int rightMargin;//右边距 private double totalWidth;//总宽度 private TextView tvStartView; private TextView tvEndView; private OnMusicInterceptListener listener; public void setListener(OnMusicInterceptListener listener) { this.listener = listener; } public interface OnMusicInterceptListener { void onTimeChange(int lTime, int rTime); void onStartChange(int lTime, int time); } public int setDuration(int duration) { this.duration = (duration / 1000); tvStartView.setText("00:00"); tvEndView.setText(formatTime(duration)); leftMargin = tvStartView.getWidth(); rightMargin = tvEndView.getWidth(); totalWidth = AndroidUtilities.getRealScreenSize().x - leftMargin - rightMargin; RelativeLayout.LayoutParams sliderLP = (LayoutParams) sliderLayout.getLayoutParams(); //最大值 maxX = totalWidth * 0.4; //最小值 minX = totalWidth * 0.3; sliderLP.width = (int) (totalWidth * 0.3); sliderLayout.setLayoutParams(sliderLP); //计算初始长度 double rPercent = div((totalWidth * 0.3), totalWidth, 2); int rTime = (int) ((rPercent) * 40); return rTime; } public static double div(double v1, double v2, int scale) { if (scale < 0) { return 0.0; } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } private String formatTime(int second) { SimpleDateFormat formatter = new SimpleDateFormat("mm:ss");//初始化Formatter的转换格式。 return formatter.format((long) second); } public MusicIntercept(Context context) { super(context); setBackgroundColor(0xFFFFFFF); tvStartView = new TextView(context); tvStartView.setId(R.id.music_intercept_start); tvStartView.setPadding(AndroidUtilities.dp(15), 0, AndroidUtilities.dp(12), 0); tvStartView.