Android 사용자 정의 수평 또는 수직 점선 효과

7758 단어 Android점선
프로젝트 에 가끔 점선 을 사용 하 는데 어떻게 합 니까?drawable 에서 shape 형식의 xml 파일 을 만 들 고 view 의 background 에 참조 하 시 겠 습 니까?점선 을 쓰 는 곳 이 많다 면?여러 개 만 들 기,각각 참조?가로 도 좋 고 세로 도 좋 은 데?수직 점선,일반적인 생 성 은 표시 되 지 않 으 며 필요 하 다 면 회전 등 을 해 야 합 니 다.그런데 아직도 그 문제 야.여러 개가 필요 한데 어 떡 하지?하나씩 만 들 까요?
전혀 필요 없습니다.사용자 정의 로 외부 노출 에 점선 속성 을 설정 하 는 방법 을 쓰 면 됩 니 다.원본 코드 는 다음 과 같 습 니 다.
마지막 설명 이 중요 해!!
마지막 설명 이 중요 해!!
마지막 설명 이 중요 해!!
효과 그림:
这里写图片描述
원본 코드:
ImaginaryLineView

package com.chen.demo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 *        view
 * chenjianqiang
 * 2017/6/14
 * <p>
 *     :
 *     findview  ,  setLineAttribute  ,          
 */
public class ImaginaryLineView extends View {

 private Context ct;
 private Paint mPaint;
 private Path mPath;
 private PathEffect effects;
 private int width;
 private int height;

 private int defaultColor=0xffff0000;

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

 public ImaginaryLineView(Context context, @Nullable AttributeSet attrs) {
 this(context, attrs, -1);
 }

 public ImaginaryLineView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);

 ct = context;
 init();
 }

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 super.onSizeChanged(w, h, oldw, oldh);
 width = w;
 height = h;

 }

 private void init() {

 //   ,      
 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 mPaint.setStyle(Paint.Style.STROKE);
 mPaint.setColor(defaultColor);
 mPaint.setStrokeWidth(dip2px(ct, 1));

 mPath = new Path();
 //    :      2  ,          。   (  0),      ,          
 effects = new DashPathEffect(new float[]{4, 2}, 0);


 }

 /**
 *         
 *
 * @param color        
 * @param lineWidth     ,   dp
 */
 public void setLineAttribute(int color, float lineWidth,float[] f) {

 if (color == 0) {
  color = defaultColor;
 }
 if (lineWidth == 0) {
  lineWidth = 1;
 }
 if(f==null){
  f=new float[]{4,2};
 }
 effects = new DashPathEffect(f, 0);

 mPaint.setStrokeWidth(dip2px(ct, lineWidth));
 mPaint.setColor(color);

 invalidate();
 }

 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);

 //    
 mPath.moveTo(0, 0);
 //    
 if(width>height){
  //      ,   
  mPath.lineTo(width, 0);
 }else{
  //  。(      ,           )
  mPath.lineTo(0, height);
 }

 mPaint.setPathEffect(effects);

 canvas.drawPath(mPath, mPaint);
 }

 private static int dip2px(Context context, float dpValue) {
 final float scale = context.getResources().getDisplayMetrics().density;
 return (int) (dpValue * scale + 0.5f);
 }

}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <TextView
 android:text="    "
 android:layout_marginStart="20dp"
 android:layout_marginTop="20dp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"/>

 <com.chen.demo.ImaginaryLineView

 android:background="#5500ff00"
 android:layout_marginStart="20dp"
 android:layout_marginTop="20dp"
 android:layout_width="100dp"
 android:layout_height="1dp"/>

 <TextView
 android:text="       "
 android:layout_marginStart="20dp"
 android:layout_marginTop="20dp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"/>

 <com.chen.demo.ImaginaryLineView
 android:id="@+id/horizontal_line"
 android:layout_marginStart="20dp"
 android:layout_marginTop="20dp"
 android:layout_width="100dp"
 android:layout_height="1dp"/>

 <TextView
 android:text="    "
 android:layout_marginStart="20dp"
 android:layout_marginTop="20dp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"/>

 <com.chen.demo.ImaginaryLineView
 android:layout_marginStart="20dp"
 android:layout_marginTop="20dp"
 android:layout_width="2dp"
 android:layout_height="100dp"/>

 <TextView
 android:text="       "
 android:layout_marginStart="20dp"
 android:layout_marginTop="20dp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"/>

 <com.chen.demo.ImaginaryLineView
 android:id="@+id/vertical_line"
 android:layout_marginStart="20dp"
 android:layout_marginTop="20dp"
 android:layout_width="2dp"
 android:layout_height="100dp"/>


</LinearLayout>

MainActivity

package com.chen.demo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class MainActivity extends Activity {

 private ImaginaryLineView horizontal_line;
 private ImaginaryLineView vertical_line;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 requestWindowFeature(Window.FEATURE_NO_TITLE);
 setContentView(R.layout.activity_main);

 horizontal_line= (ImaginaryLineView) findViewById(R.id.horizontal_line);
 horizontal_line.setLineAttribute(0xff00ff00,5,null);


 vertical_line= (ImaginaryLineView) findViewById(R.id.vertical_line);
 vertical_line.setLineAttribute(0xff0000ff,5,new float[]{10,2,5,5});


 }

}

설명:
1.이 사용자 정의 view 는 수평 인지 세로 인지 자동 으로 판단 합 니 다.레이아웃 파일 에 너비 만 설정 하면 됩 니 다.
2.사용자 정의 소스 코드 에서 점선 경 로 를 대충 제 한 했 을 뿐 입 니 다.정확히 말 하면 넓 은 중심 점 에서 높 은 중심 점 까지 해 야 합 니 다.일반적인 점선 은 모두 1px 또는 1dp 너비 이 고 소 수 는 2dp 까지 되 기 때문에 이렇게 좁은 값 을 취하 지 않 아 도 됩 니 다.만약 점선 이 매우 넓다 면 약간의 오차 가 있 을 것 이다.그림 과 같다.
这里写图片描述
파란색 은 그 려 진 점선 이지 만 이 점선 10dp 너비,즉 점선 붓 은 설 정 된 너비 보다 작 아서 이렇게 됩 니 다.하지만 보통 상황 은 없 을 겁 니 다.만일 만난다 면 실제 상황 에 따라 수정 하면 된다
3.편리 하도록 종점 을 mPath.lineTo(width,height)로 설정 하 는 것 을 권장 하지 않 습 니 다.
4.점선 이 필요 할 때 파일 에 배치 하고 setLine Attribute 를 사용 하면 됩 니 다.매번 shape 를 새로 만 들 지 않 아 도 됩 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기