11

Snapchat と同じようにフィルターを適用するアプリケーションを開発しています。Pag​​erAdapter を使用していることは理解できますが、画像やビデオにフィルターを適用する方法がわかりません。別の画像ではありません。それに適用されたフィルター。同じことができるアイデアやコードスニペットは、画像とビデオの両方で高く評価され、それらを保存することもできます. ありがとうこれは私が達成しようとしているものです[![][1][1]

4

2 に答える 2

5

ここで行っているのは、2 つのビットマップを重ね合わせることです。いずれかのビットマップをどれだけ表示するかは、ユーザーのタッチを使用して決定されます。ユーザーが基本的に左または右となしの方向にスクロールしている列挙型があります。ユーザーがスクロールする方向に応じて、異なるビットマップが現在のビットマップに適用されます。

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    if (mCurrentScrollDirection.ordinal() == ScrollDirection.NONE.ordinal()) {
        if (distanceX > 0) {
            mCurrentScrollDirection = ScrollDirection.LEFT;
        } else {
            mCurrentScrollDirection = ScrollDirection.RIGHT;
        }
    }
    mTouchX = (int) e2.getX();
    overlayBitmaps(mTouchX);
    return false;
}

private void overlayBitmaps(int coordinateX) {

    switch (mCurrentScrollDirection) {
        case NONE: {
            //do nothing here
            break;
        }
        case LEFT: {
            overlayNextBitmap(coordinateX);
            break;
        }
        case RIGHT: {
            overlayPreviousBitmap(coordinateX);
            break;
        }
    }
}

private void overlayPreviousBitmap(int coordinateX) {
    mImageCanvas.save();

    Bitmap OSBitmap = Bitmap.createBitmap(mCurrentBitmap, coordinateX, 0, mCurrentBitmap.getWidth() - coordinateX, mCurrentBitmap.getHeight());
    mImageCanvas.drawBitmap(OSBitmap, coordinateX, 0, null);

    Bitmap FSBitmap = Bitmap.createBitmap(mPreviousBitmap, 0, 0, coordinateX, mCurrentBitmap.getHeight());
    mImageCanvas.drawBitmap(FSBitmap, 0, 0, null);

    mImageCanvas.restore();

    mCapturedImageView.setImageDrawable(new BitmapDrawable(getResources(), mResultBitmap));
}

private void overlayNextBitmap(int coordinateX) {
    mImageCanvas.save();

    Bitmap OSBitmap = Bitmap.createBitmap(mCurrentBitmap, 0, 0, coordinateX, mCurrentBitmap.getHeight());
    mImageCanvas.drawBitmap(OSBitmap, 0, 0, null);

    Bitmap FSBitmap = Bitmap.createBitmap(mNextBitmap, coordinateX, 0, mCurrentBitmap.getWidth() - coordinateX, mCurrentBitmap.getHeight());
    mImageCanvas.drawBitmap(FSBitmap, coordinateX, 0, null);

    mImageCanvas.restore();

    mCapturedImageView.setImageDrawable(new BitmapDrawable(getResources(), mResultBitmap));
}

これは非常にうまく機能します。多くを見つけることができなかったことを考慮して、メモリの少ないデバイスでテストしていません:)

完全なコード リファレンスについては、このリンクをチェックしてください。画像をキャプチャしてフィルターを適用し、呼び出し元のアクティビティへのコールバックを取得できるのは、私自身のライブラリです。それはまだ進行中の作業です。

于 2016-07-19T10:30:54.407 に答える