【问题标题】:WHERE to find Android "Fingerpaint" demo? (Android Studio era)在哪里可以找到 Android“Fingerpaint”演示? (Android Studio 时代)
【发布时间】:2014-06-11 13:34:06
【问题描述】:

很多很多 Android 讨论都集中在(显然是著名的)Fingerpaint 示例上:

https://stackoverflow.com/a/16650524/294884

我从哪里获得它,与 Android Studio 一起使用? .. 2014

http://developer.android.com/samples/index.html

或者它现在完全过时了?感谢您提供任何信息

Android Studio:它没有文件夹、samples/ 之类的............

Mac - Studio 上深受喜爱的 SDK 管理器有可能提供帮助吗?

我必须使用 API11 文件夹吗?

Android 页面似乎没有显示 Fingerpaint:这是我看到的

查看每个类别,没有Fingerpaint....

在 Mac 上,我确实设法使用心爱的 ADKManager 下载了 API11 示例。令人难以置信的是,在 Mac 上,它们被深深地隐藏在一个包中(螺丝 Mac!)但是那个“样本”不存在......可悲

【问题讨论】:

  • 嗨,乔。 Raghunandan(我们的一位著名成员)于 2013 年 5 月 20 日 13:21 回答了这个问题。所以,我想它并没有那么过时。它在您的 sdk 文件夹中,在示例/图形下。在我的 Windows 安装中,它位于:[install path]\sdk\samples\android-19\legacy\ApiDemos\src\com\example\android\apis\graphics 您可能会注意到这个词 legacy 仅适用于 18 之前的版本(7 到 17 不要放在那个文件夹中)。哦,是的,这取决于您是否在 SDK 管理器中下载示例(Android Studio 有吗?我猜是的) - 或者安装 Eclipse 并从中复制文件。
  • 冷静下来……你太情绪化了。我建议你一个方法:安装 Eclipse(我猜有一个 Mac 版本,不是吗?)。将 SDK 更新到最新版本,选择“samples”文件夹。现在你的硬盘上有了它们(我不相信没有文件夹的操作系统——它是基于 Unix 或 Linux 的,就像 Android 一样,不是吗?)。只需找到它们(并导入它们——您会发现大量指南告诉您如何从 Eclipse 迁移到 Android Studio)。而且...享受!
  • @Rag -- Ahhhhh .. 他们必须向 Mac 提供不同的网页!请注意我在上面添加的第三张图片。
  • @JoeBlow:第二张图片,心爱的 SDK 经理:SDK 示例您在从 7 到 19 的所有 API 级别中都有它(之前的已退出市场无论如何)。现在也是7。所以最好从 8 到 19 都下载 - 幸运的家伙,你不必安装 Eclipse!

标签: android drawing android-studio demo


【解决方案1】:

我找到了!感谢 Golem 和 Raghunandan

在 Mac 上很难找到它。使用 SDKManager 下载 API11Samples。

接下来,您必须在 Mac 上“打包内容” Studio 应用程序本身,

向下钻取。试试“ApiDemos”

我只是不知道这是否是文件的最新版本。

这是整个文件...

对于任何 Mac 用户,为您节省时间:

据我所知,这是最新版本。另请参阅https://stackoverflow.com/a/16650524/294884的出色讨论

整个文件 Fingerpaint.java:(据我所知,这是整个示例:)

这是来自 SDK11、17 或 19:

我仔细检查了,文件在 11,17,19 中是相同的。希望它可以帮助某人。

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.apis.graphics;

import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;

public class FingerPaint extends GraphicsActivity
        implements ColorPickerDialog.OnColorChangedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(0xFFFF0000);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);

        mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 },
                                       0.4f, 6, 3.5f);

        mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
    }

    private Paint       mPaint;
    private MaskFilter  mEmboss;
    private MaskFilter  mBlur;

    public void colorChanged(int color) {
        mPaint.setColor(color);
    }

    public class MyView extends View {

        private static final float MINP = 0.25f;
        private static final float MAXP = 0.75f;

        private Bitmap  mBitmap;
        private Canvas  mCanvas;
        private Path    mPath;
        private Paint   mBitmapPaint;

        public MyView(Context c) {
            super(c);

            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(0xFFAAAAAA);

            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

            canvas.drawPath(mPath, mPaint);
        }

        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 4;

        private void touch_start(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }
        private void touch_move(float x, float y) {
            float dx = Math.abs(x - mX);
            float dy = Math.abs(y - mY);
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
                mX = x;
                mY = y;
            }
        }
        private void touch_up() {
            mPath.lineTo(mX, mY);
            // commit the path to our offscreen
            mCanvas.drawPath(mPath, mPaint);
            // kill this so we don't double draw
            mPath.reset();
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX();
            float y = event.getY();

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touch_start(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    touch_move(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    touch_up();
                    invalidate();
                    break;
            }
            return true;
        }
    }

    private static final int COLOR_MENU_ID = Menu.FIRST;
    private static final int EMBOSS_MENU_ID = Menu.FIRST + 1;
    private static final int BLUR_MENU_ID = Menu.FIRST + 2;
    private static final int ERASE_MENU_ID = Menu.FIRST + 3;
    private static final int SRCATOP_MENU_ID = Menu.FIRST + 4;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('3', 'c');
        menu.add(0, EMBOSS_MENU_ID, 0, "Emboss").setShortcut('4', 's');
        menu.add(0, BLUR_MENU_ID, 0, "Blur").setShortcut('5', 'z');
        menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('5', 'z');
        menu.add(0, SRCATOP_MENU_ID, 0, "SrcATop").setShortcut('5', 'z');

        /****   Is this the mechanism to extend with filter effects?
        Intent intent = new Intent(null, getIntent().getData());
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
        menu.addIntentOptions(
                              Menu.ALTERNATIVE, 0,
                              new ComponentName(this, NotesList.class),
                              null, intent, 0, null);
        *****/
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        mPaint.setXfermode(null);
        mPaint.setAlpha(0xFF);

        switch (item.getItemId()) {
            case COLOR_MENU_ID:
                new ColorPickerDialog(this, this, mPaint.getColor()).show();
                return true;
            case EMBOSS_MENU_ID:
                if (mPaint.getMaskFilter() != mEmboss) {
                    mPaint.setMaskFilter(mEmboss);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case BLUR_MENU_ID:
                if (mPaint.getMaskFilter() != mBlur) {
                    mPaint.setMaskFilter(mBlur);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case ERASE_MENU_ID:
                mPaint.setXfermode(new PorterDuffXfermode(
                                                        PorterDuff.Mode.CLEAR));
                return true;
            case SRCATOP_MENU_ID:
                mPaint.setXfermode(new PorterDuffXfermode(
                                                    PorterDuff.Mode.SRC_ATOP));
                mPaint.setAlpha(0x80);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

【讨论】:

  • 虽然可能不是最新版本... API 级别 17 应该是最后一个“非旧版”,而 API 级别 19 应该是最后一个“旧版”。但是自第 7 版以来,它们可能都完全相同,afaik。所以,11 是一个很好的折衷方案。
  • @gol 太棒了 - 我仔细下载了它们并检查了,自 SDK11 以来文件绝对没有变化。谢谢!!!
  • 我认为有一些免费的 API ... .干杯,伙计。
  • 嘿@Der!!!你知道,我搜索了又搜索了,我在这里问了问题等等,stackoverflow.com/questions/24013595 - 似乎没有!我很高兴自己写,但这似乎很奇怪。尽管如此,我仍然是 Android 粉丝 :) 该死的 iPhone!
  • 我进行了快速搜索,发现了一些有趣的链接:compiletimeerror.com/2013/09/…vogella.com/tutorials/AndroidTouch/article.htmljava2s.com/Code/Android/2D-Graphics/… - 我必须承认我还发现了几个 FingerPaint.java 来源,不过... ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2017-10-07
相关资源
最近更新 更多