1. 程式人生 > >Android 自定義View 圖片按Path運動和旋轉

Android 自定義View 圖片按Path運動和旋轉


View:

/**
 * author : stone
 * email  : [email protected]
 * time   : 16/5/29 15 29
 */
public class EarthPathView extends View {

    private Path mPath;
    private Paint mPaint;
    private Bitmap mBitmap;
    private PathMeasure mPathMeasure;
    private float[] mPoint;
    private float[] mTan;
    private float mDdegrees;

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

    public EarthPathView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public EarthPathView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(10);

        InputStream is = getResources().openRawResource(R.drawable.earth);
        mBitmap = BitmapFactory.decodeStream(is);

    }

    public void setPath(Path path) {
        mPath = path;
        mPathMeasure = new PathMeasure(path, false);
        mPoint = new float[2];
        mTan = new float[2];

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mPath == null) {
            return;
        }


        canvas.rotate(mDdegrees+=2, getWidth()/2, getHeight()/2);
        canvas.drawPath(mPath, mPaint);

        float degress = (float) Math.toDegrees(Math.atan2(mTan[1], mTan[0]));
        Matrix matrix = new Matrix();
        matrix.postRotate(degress, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2);
        matrix.postTranslate(mPoint[0] - mBitmap.getWidth() / 2, mPoint[1] - mBitmap.getHeight() / 2);
        canvas.drawBitmap(mBitmap, matrix, null);


    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void startAnim() {
        ValueAnimator animator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
        animator.setDuration(2000);
        animator.setInterpolator(new LinearInterpolator()); //插值器
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float distance = (float) animation.getAnimatedValue();
                mPathMeasure.getPosTan(distance, mPoint, mTan);
                invalidate();
            }
        });
        animator.start();
    }
}
Activity
package com.stone.canvaspath;

import android.app.Activity;
import android.graphics.Path;
import android.os.Bundle;

import com.stone.canvaspath.earth.EarthPathView;

/**
 * author : stone
 * email  : [email protected]
 * time   : 16/5/29 15 27
 */
public class EarthActivity extends Activity {

    private EarthPathView mPathView;
    private Path mPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        int w = getResources().getDisplayMetrics().widthPixels;
        int h = getResources().getDisplayMetrics().heightPixels;

        mPathView = new EarthPathView(this);

        setContentView(mPathView);

        int min = Math.min(w, h);
        buildPath(w / 2 + 100, h / 2 + 100, min / 4);

        mPathView.setPath(mPath);

        mPathView.startAnim();
    }

    private void buildPath(float x, float y, float radius) {
        mPath = new Path();
        mPath.addCircle(x, y, radius, Path.Direction.CW);
    }

}


相關推薦

Android 定義View 圖片Path運動旋轉

View: /** * author : stone * email : [email protected] * time : 16/5/29 15 29 */ publi

Android定義View之使用Path繪製手勢軌跡水波效果

先看下效果圖: 繪製軌跡 繪製手指的軌跡主要是攔截View的onTouchEvent()方法,並根據手指的軌跡繪製path。path中有兩種可以實現的方法 1、Path.lineTo(x,y)方法 public class MoveP

Android定義view實現圖片選色器

https://www.jb51.net/article/141336.htm 這篇文章主要為大家詳細介紹了Android自定義view實現圖片選色器,具有一定的參考價值,感興趣的小夥伴們可以參考一下 簡介 本文介紹該自定義view的使用及實現的方法,主要實現以下幾個功能: - 選取

Android 定義View ProgressBarHorizontal:橫向進度條、支援圓角、漸變、圖片

背景:因系統的ProgressBar設定圖片時,如果圖片不夠大,而在大解析度的手機上時會出現無法填充滿,所以自己寫一個,既修復該問題,又可方便拓展,所以拋磚引玉 功能介紹:橫向進度條,分為背景與封面兩層,封面與背景均支援圓角矩形、漸變、圖片。 效果圖: (上面仿微博

Android 定義view-如何設定TextView drawableLeft 圖片大小?

2017/09/07更新 開發過程中,越發強烈的覺得需要對TextView進一步封裝 1.TextView需要設定背景或者邊框時需要編寫大量的selector,稍微修改一下樣式又得編寫一個新的selector,這個實在不能忍! 2.使用原生TextView

Android-定義view之無所不能的path

自定義view之無所不能的path 最近專案中需要完成以下這個需求 UI給我了五張圖片,我感覺太浪費了,自定義view完全可以做而且適配起來更加的方便 最終實現效果 專案效果 擴充套件 需要知道技術點 在實現這個過程之前,

Android 定義View探索——圖片

繪製圖片 繪製有兩種方法,drawPicture(向量圖) 和 drawBitmap(點陣圖),接下來我們一一瞭解。 drawPicture 使用Picture前請關閉硬體加速,以免引起不必要的問題,因此在AndroidMenifest檔案中applica

Android 定義View之繪圖工具類Canvas+Paint+Path(onDraw方法)基礎詳解

本章節講述三個繪圖工具類Canvas(畫布),Paint(畫筆),Path(路徑) 1.Canvas(畫布)相關方法詳解 1.1. 方法:Canvas() 作用:建立一個空的畫布,可以使

Android定義View實現圖片顯示,並實現縮放、拖拽、切換功能

這裡貼三個檔案的原始碼,第一個是main.java package com.example.test; import java.util.ArrayList; import java.util.List; import com.example.test.MyXZ; i

Android定義 view圖片裁剪從設計到實現

android圖片剪下是常用的功能,因為部落格開發的是SDK不涉及到activity,所以就需要自定義裁剪功能,參閱了網上的大部分資料後,在github上一個封裝好的裁剪庫cropper,正好符合要求,本著拿來主義的思想,直接把原始碼clone嵌入到專案裡,然後

Android 定義View

wid declare created odi lex getwidth 實現 tdi led   最近在看鴻洋大神的博客,在看到自定義部分View部分時,想到之前案子中經常會要用到"圖片 + 文字"這類控件,如下圖所示: 之前的做法是在布局文件中,將一個Imag

Android定義view詳解

this boolean mar 處理 都是 並且 jdk text 命名 從繼承開始 懂點面向對象語言知識的都知道:封裝,繼承和多態,這是面向對象的三個基本特征,所以在自定義View的時候,最簡單的方法就是繼承現有的View 通過上面這段代碼,我定義了一個Ske

Android -- 定義view實現keep歡迎頁倒計時效果

super onfinish -m use new getc awt ttr alt 1,最近打開keep的app的時候,發現它的歡迎頁面的倒計時效果還不錯,所以打算自己來寫寫,然後就有了這篇文章。 2,還是老規矩,先看一下我們今天實現的效果   相較於我們常見的倒計時

Android定義View效果目錄

class 重寫 自定義 textview 居中 url 冒泡 and 雷達圖 1、絢麗的loading動效的實現 2、Android自定義View:進度條+冒泡文本 3、Android雷達圖(蜘蛛網圖) 4、Android文本閃爍 5、Android繪制圓形進度條 6、重

Android定義View——實現水波紋效果類似剩余流量球

string 三個點 pre ber block span 初始化 move 理解 最近突然手癢就想搞個貝塞爾曲線做個水波紋效果玩玩,終於功夫不負有心人最後實現了想要的效果,一起來看下吧: 效果圖鎮樓 一:先一步一步來分解一下實現的過程 需要繪制一個正弦曲線(sin

Android 定義 View 知識點

移動 encode swe em1 red 鋸齒 枚舉類 map() tex 根據 Hencoder 提供的知識點,進行學習和總結。 三個要點: 布局 繪制 觸摸反饋 繪制 自定義繪制:由自己實現繪制過程 常用繪制方法 onDraw(Canvas canvas) 繪制

Android定義view與activity的傳值

重復 轉動 自定義 activit 廣播 內部 代碼 view 等待 昨晚在寫團隊項目的時候,遇到一個問題,直到今天早上才解決。。。即在自定義view“轉盤”結束轉動後獲取結果的處理中,我是想吧值傳到activity中的一個textview中的,但我的自定義view類不是a

Android 定義View - 助記詞

UI今天給了個需求,把亂序的單詞拼成一句話,如下圖: 本來計劃是用ViewGroup+TextView寫的,突然腦子抽了想用paint來畫(寫完就後悔了-.-) 先看一下完成後的效果 前期的思路是這樣的: 1.測量每個單詞的高度和寬度,計算出所有單詞排列後的高*2,就是view

Android 定義WaveView 圖片隨著WaveView 滑動

xml佈局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:background="#f00" android:layout_width="match_parent"

Android定義View--翻書控制元件(一)

0.前言 最近重看了一遍封神演義,感覺QQ閱讀那個翻書的效果挺好的,準備做一個。上週五下午用了兩個小時只寫了一部分功能,以後有時間再完善 1.分析 先看效果圖 這個空間,說簡單也簡單,說難也難,簡單就在於這個效果主要就是依賴canvas的clippath才見到部分canvas,難就難在裁