Android 实现音乐剪切功能 可以选择起始点和结束点 也可以同时拖动块级元素

该博客介绍了如何在Android中实现音乐剪切功能,允许用户通过拖动选择剪切的起始点和结束点。作者提供了部分源代码,并指出计算选取的秒数及拖动操作是实现难点。为解决大文件剪切后体积过大的问题,代码逻辑设定了最大最小值限制。此外,作者强调在设置时长时最好在post方法中执行,并给出了完整的音乐剪切源代码,注意由于数据流截取可能存在误差,已对开始和结束时间做了微调。
摘要由CSDN通过智能技术生成

先看一下最终的效果





用户可以拖动两边来改变要截取音乐的长度,也可以直接拖红线来改变要截取音乐的位置


唯一的难点就是要计算出当前选择了多少秒,还有拖动时候的操作,我是直接创建的布局元素,通过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.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值