Android 탄막 프레임 어둠 의 화염 기본 사용 방법
저 는 전체 프레임 워 크 를 model 형식 으로 프로젝트 에 도입 하여 소스 코드 를 더욱 편리 하 게 관찰 합 니 다.의존 적 으로 주입 할 수도 있어 요.
dependencies {
compile 'com.github.ctiao:DanmakuFlameMaster:0.5.3'
}
내 가 만 들 효과 도 를 먼저 놓 아 라.페이지 분석
위의 그림 을 보면 전체 UI 가 3 층 으로 나 뉘 어 져 있다.맨 아래 는 영상 층 이 고 중간 은 탄막 층 이 며 꼭대기 층 은 제어 층 이다.현재 시장 에서 주류 인 영상 생방송 소프트웨어 는 대부분이 이렇게 층 을 나 누 는데 생방송 류 가 다 르 면 상호작용 층 이 더 많아 져 출석 정보,선물 정보 등 을 표시 할 수 있다.
레이 어 링 이 라면 FrameLayout 프레임 레이아웃 으로 바로 이 루어 졌 습 니 다.내 레이아웃 파일 붙 여 넣 기:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/vv_video"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<master.flame.danmaku.ui.widget.DanmakuView
android:id="@+id/sv_danmaku"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include android:id="@+id/media_controller"
android:layout_width="match_parent"
android:layout_height="fill_parent"
layout="@layout/media_controller" />
</FrameLayout>
제어 층 의 레이아웃:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="#8acc22dd" >
<Button
android:layout_weight="1"
android:id="@+id/rotate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/rotate" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:id="@+id/btn_hide"
android:layout_height="wrap_content"
android:text="@string/hide_danmaku" />
<Button
android:id="@+id/btn_show"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/show_danmaku" />
<Button
android:id="@+id/btn_pause"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/pause_danmaku" />
<Button
android:id="@+id/btn_resume"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/resume_danmaku" />
<Button
android:id="@+id/btn_send"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/send_danmaku" />
<Button
android:id="@+id/btn_send_image_text"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/send_danmaku_image_text" />
<Button
android:id="@+id/btn_send_danmakus"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/send_danmakus" />
</LinearLayout>
</FrameLayout>
레이아웃 을 쓰 고 초기 화 하 는 방법 을 먼저 쓰 십시오.
//
HashMap<Integer,Integer> maxLinesPair = new HashMap<>();
maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL,5);// 5
//
HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<>();
overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true);
overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true);
mDanmakuContext = DanmakuContext.create();//
mDanmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN,3);//
mDanmakuContext.setDuplicateMergingEnabled(false);//
mDanmakuContext.setScrollSpeedFactor(1.2f);//
mDanmakuContext.setScaleTextSize(1.2f);//
mDanmakuContext.setCacheStuffer(new SpannedCacheStuffer(),mCacheStufferAdapter);// SpannedCacheStuffer
mDanmakuContext.setMaximumLines(maxLinesPair);//
mDanmakuContext.preventOverlapping(overlappingEnablePair); //
mParser = createParser(this.getResources().openRawResource(R.raw.comments));//
mDvDanmaku.prepare(mParser, mDanmakuContext);
mDvDanmaku.showFPS(true);
mDvDanmaku.enableDanmakuDrawingCache(true);
그리 기 충전 기 를 다시 붙 여 넣 으 면 그림 과 문 자 를 함께 배열 하 는 효과 가 있 습 니 다.
private SpannableStringBuilder createSpannable(Drawable drawable) {
String text = "bitmap";
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
ImageSpan span = new ImageSpan(drawable);
spannableStringBuilder.setSpan(span, 0, text.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableStringBuilder.append(" ");
spannableStringBuilder.setSpan(new BackgroundColorSpan(Color.parseColor("#8A2233B1")), 0, spannableStringBuilder.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
return spannableStringBuilder;
}
BaseDanmaku 와 같은 종류 에서 탄막 의 기본 운동 형식 을 정의 했다:TYPESCROLL_RL、TYPE_SCROLL_LR、TYPE_FIX_TOP、TYPE_FIX_BOTTOM 과 TYPESPECIAL。즉,오른쪽 에서 왼쪽으로,왼쪽 에서 오른쪽으로(역방향 탄막),상단 탄막,밑부분 탄막 과 고급 탄막 이다.스 크 립 트 탄막초기 화 할 때 특유 의 탄막 컨 텍스트 인 DanmukuContext 를 입력 하고 컨 텍스트 를 통 해 일부 설정 을 초기 화 해 야 합 니 다.탄막 자원 은 xml 파일 에 저 장 됩 니 다.대체적으로 다음 과 같 습 니 다.
.
<i>
<chatserver>chat.bilibili.com</chatserver>
<chatid>2962351</chatid>
<mission>0</mission>
<maxlimit>1500</maxlimit>
<source>k-v</source>
<d p="145.91299438477,1,25,16777215,1422201001,0,D6673695,757075520"> </d>
</i>
헤드 정 보 는 많은 관심 을 가 질 필요 가 없습니다.d 태그 에서 p 에 대응 하 는 매개 변수의 구체 적 인 의 미 를 보십시오.첫 번 째:탄막 출현 시간
두 번 째:탄막 유형(1.오른쪽 에서 왼쪽으로;6.왼쪽 에서 오른쪽으로;5.상단 탄막;4.바닥 탄막;7.고급 탄막;8.스 크 립 트 탄막')
번호
색상
타임 스탬프
여섯 번 째:스크린 샷 ID
일곱 번 째:사용자 hash 값
여덟 번 째:탄막 id
다음은 탄막 구체 적 해석 코드 입 니 다.
/**
*
* @param stream
* @return
*/
private BaseDanmakuParser createParser(InputStream stream) {
if (stream == null) {
return new BaseDanmakuParser() {
@Override
protected Danmakus parse() {
return new Danmakus();
}
};
}
ILoader loader = DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI);// BiliDanmakuLoader
try {
loader.load(stream);
} catch (IllegalDataException e) {
e.printStackTrace();
}
BaseDanmakuParser parser = new BiliDanmukuParser();//
IDataSource<?> dataSource = loader.getDataSource();
parser.load(dataSource);
return parser;
}
구체 적 인 해석 방안:
String tagName = localName.length() != 0 ? localName : qName;
tagName = tagName.toLowerCase(Locale.getDefault()).trim();
if (tagName.equals("d")) {
String pValue = attributes.getValue("p");
// parse p value to danmaku
String[] values = pValue.split(",");
if (values.length > 0) {
long time = (long) (Float.parseFloat(values[0]) * 1000); //
int type = Integer.parseInt(values[1]); //
float textSize = Float.parseFloat(values[2]); //
int color = Integer.parseInt(values[3]) | 0xFF000000; //
item = mContext.mDanmakuFactory.createDanmaku(type, mContext);
if (item != null) {
item.setTime(time);
item.textSize = textSize * (mDispDensity - 0.6f);
item.textColor = color;
item.textShadowColor = color <= Color.BLACK ? Color.WHITE : Color.BLACK;
}
}
}
탄막 자원 로드 가 완료 되면 mDvDanmuku 의 prepare()방법 을 사용 하여 준 비 를 수행 합 니 다.준비 가 완료 되면 DrawHandler.CallBack()리 셋 의 prepared 방법 을 호출 합 니 다.그리고 이 prepared 방법 에서 본 격 적 으로 탄막 을 작 동 시 킵 니 다.호출 순 서 는 다음 과 같 습 니 다.
mDvDanmaku.prepare(mParser, mDanmakuContext);//
그리고 Danmuku View 의 prepare()방법 을 실행 합 니 다.
private void prepare() {
if (handler == null)
handler = new DrawHandler(getLooper(mDrawingThreadType), this, mDanmakuVisible);// Handler
}
이 Handler 를 통 해 프로 세 스 간 통신 을 실현 합 니 다.handler.setConfig(config);
handler.setParser(parser);
handler.setCallback(mCallback);
handler.prepare();-》handler 에 게 메 시 지 를 보 내 서 진짜 준 비 를 하도록 하 겠 습 니 다.
Draw Handler 중 에 반전 이 있어 요.
public interface Callback {
public void prepared();
public void updateTimer(DanmakuTimer timer);
public void danmakuShown(BaseDanmaku danmaku);
public void drawingFinished();
}
진정한 준비
mTimeBase = SystemClock.uptimeMillis();
if (mParser == null || !mDanmakuView.isViewReady()) {// , 0.1
sendEmptyMessageDelayed(PREPARE, 100);
} else {
prepare(new Runnable() {
@Override
public void run() {
pausedPosition = 0;
mReady = true;
if (mCallback != null) {
mCallback.prepared();
}
}
});
}
이상 은 탄막 View 의 시작 호출 프로 세 스 입 니 다.그럼 탄막 주 무 르 기 는 어떻게 추가 하나 요?원 방 씨,어떻게 생각 하 세 요?TM 내 가 어떻게 알 아?내 가 어떻게 봐?)아래 봐 봐.
private void addDanmaku(boolean islive) {
BaseDanmaku danmaku = mDanmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);//
if (danmaku == null || mDvDanmaku == null) {
return;
}
danmaku.text = " " + System.nanoTime();
danmaku.padding = 5;
danmaku.priority = 0; // 1 ,
danmaku.isLive = islive;
danmaku.setTime(mDvDanmaku.getCurrentTime() + 1200);
danmaku.textSize = 25f * (mParser.getDisplayer().getDensity() - 0.6f);
danmaku.textColor = Color.RED;//
danmaku.textShadowColor = Color.WHITE;
danmaku.borderColor = Color.GREEN;// ,
mDvDanmaku.addDanmaku(danmaku);
}
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 탄막 프레임 의 어두 운 불꽃 으로 여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.