Android 개발: TextView 가 진정 으로 제어 할 수 있 고 초점 이 필요 없 는 수평 스크롤 - 이것 이 야 말로 진정한 주마등 입 니 다.
19809 단어 안 드 로 이 드 개발
이곳 은 진정 으로 제어 할 수 있 는 스크롤 을 실현 한다.
(1) 초점 필요 없 음
(2) 임 의 글자 수
(3) 스크롤 영역 오른쪽 에서 나 오고 왼쪽 에서 사라 지고 오른쪽 에서 나 옵 니 다.
상위 코드
1. 레이아웃 파일
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" 1"/>
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/btn1"
android:text=" 2"/>
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/btn2"
android:text=" "/>
<com.using.margindemo.MarqueeTextView
android:id="@+id/tvScroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40dp" >
</com.using.margindemo.MarqueeTextView>
</RelativeLayout>
2. 스크롤 컨트롤
package com.using.margindemo;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.TextView;
public class MarqueeTextView extends TextView {
/** */
private boolean mStopMarquee;
private String mText;//
private float mCoordinateX = 1280;//
private float mTextWidth;//
private int mScrollWidth = 1280;//
private int speed = 1;//
public float getCurrentPosition() {
return mCoordinateX;
}
public void setCurrentPosition(float mCoordinateX) {
this.mCoordinateX = mCoordinateX;
}
public int getScrollWidth() {
return mScrollWidth;
}
public void setScrollWidth(int mScrollWidth) {
this.mScrollWidth = mScrollWidth;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setText(String text) {
this.mText = text;
mTextWidth = getPaint().measureText(mText);
//mTextWidth = 1280;
if (mHandler.hasMessages(0))
mHandler.removeMessages(0);
mHandler.sendEmptyMessageDelayed(0, 10);
}
@Override
protected void onAttachedToWindow() {
mStopMarquee = false;
if (!isEmpty(mText))
mHandler.sendEmptyMessageDelayed(0, 2000);
super.onAttachedToWindow();
}
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
@Override
protected void onDetachedFromWindow() {
mStopMarquee = true;
if (mHandler.hasMessages(0))
mHandler.removeMessages(0);
super.onDetachedFromWindow();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!isEmpty(mText))
canvas.drawText(mText, mCoordinateX, 150, getPaint());
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
if (mCoordinateX < (-mTextWidth)) {// ,
mCoordinateX = mScrollWidth;
invalidate();
if (!mStopMarquee) {
sendEmptyMessageDelayed(0, 500);
}
} else {
mCoordinateX -= speed;
invalidate();
if (!mStopMarquee) {
sendEmptyMessageDelayed(0, 30);
}
}
break;
}
super.handleMessage(msg);
}
};
}
3、
package com.using.margindemo;
import android.app.ActionBar;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
private ImageView image;
private MarqueeTextView marqueeTextView;
private Button button1;
private Button button2;
private Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//
setContentView(R.layout.activity_main);
marqueeTextView = (MarqueeTextView)findViewById(R.id.tvScroll);
MarginLayoutParams margin1 = new MarginLayoutParams(
marqueeTextView.getLayoutParams());
margin1.setMargins(100, 200, 0, 0);// : 400 , 10
RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(margin1);
layoutParams1.height = 240;//
layoutParams1.width = 1000; //
marqueeTextView.setLayoutParams(layoutParams1);
marqueeTextView.setScrollWidth(1000);
marqueeTextView.setCurrentPosition(100 + 1000);//
marqueeTextView.setSpeed(2);
marqueeTextView.setText(" !");
button1 = (Button)findViewById(R.id.btn1);
button2 = (Button)findViewById(R.id.btn2);
button3 = (Button)findViewById(R.id.btn3);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
marqueeTextView.setText(" !");
}
});
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
marqueeTextView.setText(" : , , , , !");
}
});
button3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
데모 다운로드
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 개발 에 사용 되 는 MT 난수 생 성기이전의 AS3 이식 판 을 약간 고 쳐 서 현재 jkanji 에 사용 하고 있 습 니 다.테스트 를 좀 해 봤 는데 버그 가 별로 없 는 것 같 아 요.가장 간단 한 동전 테스트 를 해 봤 는데 같은 씨앗 의 경우 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.