集成类项目小结

概述

该项目是我方参与整个APP的部分模块开发,将开发好得功能以SDK的方式提供给APP调用。开发任务比较简单,主要问题出在sdk集成上面,下面记录开发中遇到的问题,还有部分关键技术。

技术点

视频播放

需求:支持视屏播放,在线播放、快进、定位、调节音量、本地播放;需要支持常见的格式

基于该需求,原生的Media框架已经不再能适应,于是寻找到了业内广泛使用的ijkPlayer,并基于该库封装的GSYVideoPlayer,使用很简单,Demo比较全面。有一个问题是该库中引用到了22.2.1的RecycleView,如果自身项目中的RecycleView库版本不一致,就会有类加载异常的问题。不过刚看了一下,库的作者已经更新了supportLibraryVersion,所以大胆用吧。

该库采用的ffmpeg支持了市面上大多数的音视频格式;视频在线播放,缓存处理的都比较恰当,有兴趣的看官可以自行去研究。

Git:
https://github.com/Bilibili/ijkplayer
https://github.com/CarGuo/GSYVideoPlayer

列表下载

需求:多任务同时下载,断点续传,下载历史

思路:主要就是线程、持久化两个点。一个task代表一条下载任务,占用一条线程;利用SqlLite 保存任务下载状态;APP被关闭时保存当前下载任务的状态;APP启动是的时候查询下载任务。这里就先不介绍我的实现代码了。介绍两个三方库,思路更加清晰。

Git:AndroidDownloaderAria

类似IOS浮动圆点菜单

需求:类似IOS的界面圆形Menu,支持滑动,支持json配置

思路:自定义控件,拦截触摸事件,移动View

这里写图片描述

类代码如下

package com.webber.mcorelibspace.demo.core;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;

import com.android_mobile.core.utiles.Lg;
import com.android_mobile.core.utiles.Utiles;
import com.webber.mcorelibspace.R;

/**
 * Created by mxh on 2017/6/19.
 * Describe:滑动菜单圆点
 */

public class SlidMenuBar extends FrameLayout {

    private int mLimitSize = 10;
    private ImageView imageView;
    private int maxW;
    private int maxH;

    public SlidMenuBar(Context context) {
        this(context, null);
    }

    public SlidMenuBar(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SlidMenuBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        int mDeviceHeight = Utiles.getScreenHeight(context);
        int mDeviceWidth = Utiles.getScreenWidth(context);
        int mDevicesStatusBar = Utiles.getStatusBarHeight(context);
        imageView = new ImageView(context);
        FrameLayout.LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        imageView.setBackgroundResource(R.mipmap.ic_launcher);

        imageView.setOnTouchListener(new OnTouchListener() {
            float mCurrentX = 0;
            float mCurrentY = 0;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        mCurrentX = event.getRawX();
                        mCurrentY = event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        float mMoveX = event.getRawX() - mCurrentX;
                        float mMoveY = event.getRawY() - mCurrentY;
                        //校验是否符合触发距离
                        if (Math.abs(mMoveX) > mLimitSize || Math.abs(mMoveY) > mLimitSize) {
                            FrameLayout.LayoutParams lp = (LayoutParams) imageView.getLayoutParams();
                            lp.topMargin += event.getRawY() - mCurrentY;
                            lp.leftMargin += event.getRawX() - mCurrentX;
                            judgeMargin(lp);

                            imageView.setLayoutParams(lp);
                        }
                        mCurrentX = event.getRawX();
                        mCurrentY = event.getRawY();
                        break;
                    case MotionEvent.ACTION_UP:
                        //抬起后修正边界
                        float mUpX = mCurrentX = event.getRawX();
                        float mUpY = mCurrentY = event.getRawY();
                        break;
                }
                invalidate();
                return true;
            }
        });
        imageView.measure(0, 0);
        maxW = mDeviceWidth - imageView.getMeasuredWidth();
        maxH = mDeviceHeight - imageView.getMeasuredHeight() - mDevicesStatusBar;
        Lg.print("webber", maxW + "," + maxH);
        addView(imageView, lp);
    }

    private void judgeMargin(LayoutParams lp) {
        if (lp.leftMargin >= maxW) {
            lp.leftMargin = maxW;
        }
        if (lp.leftMargin <= 0) {
            lp.leftMargin = 0;
        }
        if (lp.topMargin >= maxH) {
            lp.topMargin = maxH;
        }
        if (lp.topMargin <= 0) {
            lp.topMargin = 0;
        }
    }

}

问题

  1. SDK集成问题aar
  2. jar包冲突
  3. 资源文件、清单文件合并冲突

问题主要体现在包合并上,已经新开一篇来记录,详情请看
Android 打包、资源合并问题 “Manifest merger failed with multiple errors” and “Could not expand ZIP”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值